XAML如何让Canvas的Child填充整个Canvas?

时间:2013-02-08 21:02:58

标签: windows-8 winrt-xaml

如果我有这个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>

只有网格被蓝色矩形填充,但我希望Canvas以相同的方式运行并填充蓝色矩形?

我想制作一个自定义画布,但不知道如何去做。

有什么建议吗?

2 个答案:

答案 0 :(得分:8)

您可以尝试这样的事情:

<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>

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

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

答案 1 :(得分:2)

由于Canvas不服从HorizontalAlignmentVerticalAlignment,因此您必须明确设置嵌套元素的大小。

一个选项是元素绑定:

<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差距 - like this one - 这可能是一个更可重用的选项吗?

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