29

如何使用附加属性在 wpf 画布中居中元素?

4

4 回答 4

48

我遇到了这篇文章,因为我正在寻找一种仅在 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自身的一部分。ACanvas是用来绘制而不是放置控件的东西。因此,您不能将CanvasAPI 用于这些控件,因为Grid显然它就像一个孤立的叠加层。

如果您想要一个单独的叠加层,而这Canvas是您的背景,那么您最好使用此解决方案。

于 2016-03-09T17:27:04.493 回答
23

像这样的东西。

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

double top  = (Canvas.ActualHeight - element.ActualHeight) / 2;
Canvas.SetTop(element, top);
于 2010-02-05T17:24:56.607 回答
9

我知道这样做的唯一方法是找出画布的大小,然后根据它设置属性。这可以使用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);
}
于 2010-02-05T17:30:47.633 回答
3

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

<Grid>
    <Canvas Width="200" Height="200" Background="Black" />
    <Button Width="50" Height="20" > Hello
    </Button>
</Grid>
于 2013-11-22T14:50:53.717 回答