我正在努力学习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 - 结果截图:
请注意,一般缺少象牙背景和OuterBorder仍然是控件右上角的一个小工件,而childelement显然要大得多。
答案 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>
编辑:
您可以在MSDN的remarks
部分阅读此行为的原因:
Canvas是唯一没有固有布局特征的面板元素。 Canvas的默认高度和宽度属性为零,除非它是自动调整其子元素大小的元素的子元素。画布的子元素永远不会调整大小,它们只是定位在指定的坐标处。这为不需要或不需要固有尺寸限制或对准的情况提供了灵活性。对于您希望子内容自动调整大小并对齐的情况,通常最好使用Grid元素。