4

如果我有这个 XAML:

<Grid xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
<StackPanel Orientation="Horizontal">
    <Grid Background="Gray" Margin="5"
        Height="200" Width="200">
        <Rectangle Fill="Blue" />
    </Grid>
    <Canvas Background="Gray" Margin="5"
        Height="200" Width="200">
        <Rectangle Fill="Blue" />
    </Canvas>
    <StackPanel Background="Gray" Margin="5"
        Height="200" Width="200">
        <Rectangle Fill="Blue" />
    </StackPanel>
</StackPanel>

只有 Grid 被蓝色矩形填充,但我希望 Canvas 以相同的方式操作并用蓝色矩形填充?

我准备制作自定义画布,但不知道如何去做。

有什么建议么?

4

2 回答 2

11

你可以尝试这样的事情:

<Canvas x:Name="myCanvas" Background="Gray" Margin="5"
    Height="200" Width="200">
    <Rectangle Fill="Blue"
               Height="{Binding ElementName=myCanvas, Path=ActualHeight}"
               Width="{Binding ElementName=myCanvas, Path=ActualWidth}" />
</Canvas>

这将告诉矩形从命名元素的实际尺寸中获取其尺寸。

只有 Grid 被填充的原因是因为它是唯一一个告诉它的孩子的大小。StackPanel 从所有子元素的组合大小中获取它的大小,而 Canvas 是您告诉它的大小,但不会调整任何子元素的大小。

于 2013-02-09T22:52:54.687 回答
4

由于 Canvas 不遵守 Horizo ​​ntalAlignmentVerticalAlignment,因此您必须明确设置嵌套元素的大小。

一种选择是元素绑定:

<Canvas x:Name="theCanvas" Background="Gray" Margin="5" Height="200" Width="200" >
     <Rectangle Fill="Blue" 
                Height="{Binding ElementName=theCanvas, Path=Height}" 
                Width="{Binding ElementName=theCanvas, Path=Width}"  />
</Canvas>

这有点脆弱,因为它依赖于父元素名称(此处myCanvas)。在 WPF 中,您可以使用RelativeSource FindAncestor 来解决此问题,但在 Silverlight 或 Windows 8 中则不行。

您可以找到许多解决方法/扩展来填补 FindAncestor 空白 -就像这个- 这样可能是一个更可重用的选项?

您也可以在转换器中执行某些操作,遍历可视化树以获取画布尺寸。

于 2013-02-09T23:00:22.437 回答