如果我有这个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以相同的方式运行并填充蓝色矩形?
我想制作一个自定义画布,但不知道如何去做。
有什么建议吗?
答案 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不服从HorizontalAlignment和VerticalAlignment,因此您必须明确设置嵌套元素的大小。
一个选项是元素绑定:
<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 - 这可能是一个更可重用的选项吗?
您也可以在转换器中执行某些操作,遍历可视树以获取画布尺寸。