如何将 wpf 画布中的元素居中

发布于 2024-08-20 05:50:55 字数 30 浏览 11 评论 0原文

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

How can I center an element in wpf canvas using attached properties?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

后知后觉 2024-08-27 05:50:55

我看到这篇文章是因为我正在寻找一种仅在 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 是您的背景,那么您可以使用此解决方案。

I came across this post, because I was searching for a way to center an element within a Canvas in XAML only, instead of using Attached Properties.

Just in case, you came for the same reason:

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

One more thing, though

Beware that every solution here is a trap, depending on what you try to achieve. Just because your element is within the Canvas on a hierarchical order, it will not be part of the Canvas itself. A Canvas is something to draw on and not to place controls in. So you cannot use the Canvas API for those controls, because the Grid is like an isolated overlay, obviously.

If you want a separated overlay, whilst the Canvas is your background, you are good to go with this solution.

半透明的墙 2024-08-27 05:50:55

像这样的东西。

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

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

Something like this.

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

double top  = (Canvas.ActualHeight - element.ActualHeight) / 2;
Canvas.SetTop(element, top);
瑶笙 2024-08-27 05:50:55

我知道执行此操作的唯一方法是计算画布的大小,然后根据该大小设置属性。这可以使用画布上 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);
}

The only way I know to do this is to figure out the size of the canvas, and then set the properties based off that. This can be done using an event handler for SizeChanged on the canvas:

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);
}
淡忘如思 2024-08-27 05:50:55

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

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

You can put the Canvas and the element you want to be centered inside a Grid :

<Grid>
    <Canvas Width="200" Height="200" Background="Black" />
    <Button Width="50" Height="20" > Hello
    </Button>
</Grid>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文