如何在wpf canvas中居中元素

q43xntqr  于 12个月前  发布在  其他
关注(0)|答案(4)|浏览(121)

如何使用附加属性在wpf canvas中居中放置元素?

vshtjzan

vshtjzan1#

我偶然发现了这篇文章,因为我正在寻找一种方法,只在XAML中将Canvas中的元素居中,而不是使用Attached Properties。
以防万一,你也是为了同样的原因来的:

<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是你的背景,你很适合这个解决方案。

46scxncf

46scxncf2#

就像这样。

double left = (Canvas.ActualWidth - element.ActualWidth) / 2;
Canvas.SetLeft(element, left);

double top  = (Canvas.ActualHeight - element.ActualHeight) / 2;
Canvas.SetTop(element, top);
x33g5p2x

x33g5p2x3#

我所知道的唯一方法是计算出画布的大小,然后根据它设置属性。这可以在画布上使用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);
}
siotufzp

siotufzp4#

您可以将Canvas和您想要居中的元素放在Grid中:

<Grid>
    <Canvas Width="200" Height="200" Background="Black" />
    <Button Width="50" Height="20" > Hello
    </Button>
</Grid>

相关问题