如何使用附加属性在wpf canvas中居中放置元素?
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是你的背景,你很适合这个解决方案。
Canvas
Grid
46scxncf2#
就像这样。
double left = (Canvas.ActualWidth - element.ActualWidth) / 2; Canvas.SetLeft(element, left); double top = (Canvas.ActualHeight - element.ActualHeight) / 2; Canvas.SetTop(element, top);
x33g5p2x3#
我所知道的唯一方法是计算出画布的大小,然后根据它设置属性。这可以在画布上使用SizeChanged的事件处理程序来完成:
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); }
siotufzp4#
您可以将Canvas和您想要居中的元素放在Grid中:
<Grid> <Canvas Width="200" Height="200" Background="Black" /> <Button Width="50" Height="20" > Hello </Button> </Grid>
4条答案
按热度按时间vshtjzan1#
我偶然发现了这篇文章,因为我正在寻找一种方法,只在XAML中将Canvas中的元素居中,而不是使用Attached Properties。
以防万一,你也是为了同样的原因来的:
还有一件事
请注意,这里的每一个解决方案都是一个陷阱,这取决于你试图实现的目标。仅仅因为你的元素是在
Canvas
的层次结构中,它不会是Canvas
本身的一部分。Canvas
是用来绘制而不是放置控件的东西。因此,您不能对这些控件使用Canvas
API,因为显然,Grid
就像一个隔离的覆盖层。如果你想要一个分离的叠加,而
Canvas
是你的背景,你很适合这个解决方案。46scxncf2#
就像这样。
x33g5p2x3#
我所知道的唯一方法是计算出画布的大小,然后根据它设置属性。这可以在画布上使用
SizeChanged
的事件处理程序来完成:siotufzp4#
您可以将Canvas和您想要居中的元素放在Grid中: