3

我正在尝试学习 WPF,但我陷入了僵局。问题是我有一个从 UIControl 派生的控件,相关部分:

    <Grid>
    <Border x:Name="OuterBorder" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" BorderThickness="2" BorderBrush="Black">
        <Canvas x:Name ="InternalCanvas" Width="Auto" Height="Auto" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Background="Ivory">
        </Canvas>
    </Border>
</Grid>

当我渲染控件时,这给了我一个小黑点;我认为这是边界。

然后我在 InitizializeComponents 之后将代码添加到构造函数:

        Label l = new Label(); 
        l.Content = "HELLO"; 
        l.BorderThickness = new Thickness(2);
        l.BorderBrush = Brushes.Bisque;
        if (this.GetType() == typeof(SO.SOGraphNode)) 
            this.InternalCanvas.Children.Add(l);

代码的意图是如果类没有被继承,它应该显示某种占位符。它确实如此。

问题是 InternalCanvas 和它的 ecplipsing OuterBorder 不会围绕新创建的 nice 标签调整大小。

边框仍然是点边框,标签后面看不到 InternalCanvas 的象牙色背景。

我用谷歌搜索了很多,相信我需要刷新或更新画布/控制元素,但我不再那么确定了。主要是通过观察大量的 Dispatcher.Invoke 变体,我在不同点的代码中非常自由地应用了这些变体,每次都没有行为变化。

WPF 对我来说还是有点倾斜,如果有人知道我如何解决这个问题,我确实有一个闪亮的“正确答案”可以分发。:)

编辑 1 - 结果的屏幕截图:

此画布没有调整大小!

请注意象牙色背景的普遍缺乏,并且 OuterBorder 仍然是控件右上角的一个小工件,而子元素显然要大得多。

4

2 回答 2

2

你能告诉我们它是如何渲染的吗?我在一个新项目中尝试了您的 xaml,但无法弄清楚问题所在

于 2013-03-05T09:11:20.117 回答
2

“InternalCanvas”元素是画布类型对您来说很重要吗?因为如果您使用例如 Grid 代替,示例工作正常:

<Border x:Name="OuterBorder" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" BorderThickness="2" BorderBrush="Black">
        <Grid x:Name ="InternalGrid" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Background="Ivory">
        </Grid>
    </Border>

编辑:

您可以在MSDNremarks的部分中阅读此行为的原因:

Canvas 是唯一没有固有布局特征的面板元素。Canvas 的默认高度和宽度属性为零,除非它是自动调整其子元素大小的元素的子元素。Canvas 的子元素永远不会调整大小,它们只是定位在指定的坐标处。这为不需要或不需要固有尺寸约束或对齐的情况提供了灵活性。对于您希望子内容自动调整大小和对齐的情况,通常最好使用 Grid 元素。

于 2013-03-05T10:24:51.940 回答