【发布时间】:2011-01-13 14:51:07
【问题描述】:
如何使用附加属性在 wpf 画布中居中元素?
【问题讨论】:
标签: wpf canvas wpf-positioning
如何使用附加属性在 wpf 画布中居中元素?
【问题讨论】:
标签: wpf canvas wpf-positioning
我遇到了这篇文章,因为我正在寻找一种仅在 XAML 中将 Canvas 中的元素居中的方法,而不是使用附加属性。
以防万一,你来也是出于同样的原因:
<Canvas x:Name="myCanvas">
<Grid Width="{Binding ActualWidth, ElementName=myCanvas}"
Height="{Binding ActualHeight, ElementName=myCanvas}">
<Label Content="Hello World!"
HorizontalAlignment="Center"
VerticalAlignment="Center"
/>
</Grid>
</Canvas>
请注意,这里的每个解决方案都是一个陷阱,具体取决于您尝试归档的内容。仅仅因为您的元素在分层顺序上位于 Canvas 内,它就不会成为 Canvas 本身的一部分。 Canvas 是用来绘制而不是放置控件的东西。所以你不能对这些控件使用Canvas API,因为Grid 显然就像一个孤立的覆盖。
如果您想要一个单独的叠加层,而 Canvas 是您的背景,那么您最好使用这个解决方案。
【讨论】:
您可以将 Canvas 和您想要居中的元素放在 Grid 中:
<Grid>
<Canvas Width="200" Height="200" Background="Black" />
<Button Width="50" Height="20" > Hello
</Button>
</Grid>
【讨论】:
我知道的唯一方法是计算画布的大小,然后根据它设置属性。这可以使用画布上SizeChanged 的事件处理程序来完成:
parentCanvas.SizeChanged += new SizeChangedEventHandler(parentCanvas_SizeChanged);
void parentCanvas_SizeChanged(object sender, SizeChangedEventArgs e)
{
parentCanvas.SetLeft(uiElement, (parentCanvas.ActualWidth - uiElement.ActualWidth) / 2);
parentCanvas.SetTop(uiElement, (parentCanvas.ActualHeight - uiElement.ActualHeight) / 2);
}
【讨论】:
类似的东西。
double left = (Canvas.ActualWidth - element.ActualWidth) / 2;
Canvas.SetLeft(element, left);
double top = (Canvas.ActualHeight - element.ActualHeight) / 2;
Canvas.SetTop(element, top);
【讨论】: