XAML 和绑定看起来非常强大,但有时一些简单的问题需要非常复杂的解决方案。在我的绑定库中,创建这样的绑定就像编写element.Center = position
or一样简单element.TopLeft = position - element.Size / 2
,但不要让我得意忘形。
我找到了一个非常简单的解决方案,它只使用 XAML 并支持绑定元素的大小和位置属性。似乎当 WPF 控件也设置了对齐Stretch
或Center
放置在画布内时,元素“倾向于”作为(Canvas.Left, Canvas.Top)
点居中(我们想要的状态),但被放置在同(Canvas.Left, Canvas.Top)
一点的“角板”停止. 我怎么知道这个“万有引力”?Margin
当您通过将元素的 设置为负值来缓和块时,这一点很明显。设置负边距允许元素向其中心目标移动。元素移动直到Margin
到达(-Height / 2, -Width / 2)
,使元素完全居中在(Canvas.Left, Canvas.Top)
观点。进一步的更改不会导致任何移动,因为元素已经完美定位。
解决方案:设置Margin="-1000000"
.
所以在下面的代码中,椭圆都以 (200, 200) 点为中心。第一个椭圆具有对应于椭圆中心Left
的Top
属性,可以轻松地将它们与其他一些对象的属性绑定。
<Canvas>
<Ellipse Width="100" Height="100" Canvas.Left="200" Canvas.Top="200" Opacity="0.5" Fill="Red" Margin="-100000" />
<Ellipse Width="100" Height="100" Canvas.Left="150" Canvas.Top="150" Opacity="0.5" Fill="Blue" />
</Canvas>
不好的是这个解决方案只适用于 WPF。Silverlight 和 WinRT 没有所描述的行为。