C# wpf帆布赢得';t调整大小

C# wpf帆布赢得';t调整大小,c#,.net,wpf,wpf-controls,C#,.net,Wpf,Wpf Controls,我正在努力学习WPF,但我已经陷入了僵局。问题是我有一个源自UIControl的控件,相关部分: <Grid> <Border x:Name="OuterBorder" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" BorderThickness="2" BorderBrush="Black"> <Canvas x:Name ="InternalCanvas" Wi

我正在努力学习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>
代码的目的是,如果类没有被继承,它应该显示某种占位符。确实如此

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

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

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

WPF仍然对我有点偏袒,如果有人知道我如何解决这个问题,我确实有一个闪亮的“正确答案”要分发给他们

编辑1-结果屏幕截图:


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

您能告诉我们它是如何渲染的吗?我在一个新项目中尝试了您的xaml,但我不知道问题出在哪里

对于您来说,“InternalCanvas”元素是画布类型是否重要? 因为如果改用网格作为示例,示例工作正常:

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

编辑:

这种行为的原因您可以在以下内容的
备注
部分中阅读:


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


事实并非如此。虽然我仍然想知道为什么Canvas不会表现出这种行为,但我会将您的答案作为正确答案。谢谢!@StackLourger:也许这个链接可以帮助您理解这种行为。“画布的默认高度和宽度属性为零,除非它是自动调整其子元素大小的元素的子元素。”哪些画布会这样做?
<Border x:Name="OuterBorder" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" BorderThickness="2" BorderBrush="Black">
        <Grid x:Name ="InternalGrid" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Background="Ivory">
        </Grid>
    </Border>