wpf canvas不会调整大小

时间:2013-03-05 08:58:51

标签: c# .net wpf wpf-controls

我正在努力学习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不会在新创建的漂亮标签周围调整大小。

边框仍然是一个点边框,而标签后面没有看到InternalCanvas的象牙背景。

我已经google了很多,相信我需要刷新或更新画布/控制元素,但我不再那么肯定了。主要通过观察很多Dispatcher.Invoke变体,我已经非常自由地通过不同点的代码应用,每次都没有改变行为。

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

编辑1 - 结果截图:

No resize for this Canvas!

请注意,一般缺少象牙背景和OuterBorder仍然是控件右上角的一个小工件,而childelement显然要大得多。

2 个答案:

答案 0 :(得分:2)

你能告诉我们它是如何呈现的吗?我在一个新项目中尝试了你的xaml,我无法弄清楚问题是什么

答案 1 :(得分: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的默认高度和宽度属性为零,除非它是自动调整其子元素大小的元素的子元素。画布的子元素永远不会调整大小,它们只是定位在指定的坐标处。这为不需要或不需要固有尺寸限制或对准的情况提供了灵活性。对于您希望子内容自动调整大小并对齐的情况,通常最好使用Grid元素。