XAML和数据绑定看起来很强大,但有时候简单的问题需要非常复杂的解决方案。在我的绑定库中创建这样的绑定就像写 element.Center = position
或者 element.TopLeft = position - element.Size / 2
那么容易,但不要让我太沉迷其中。
我找到了一个非常简单的解决方案,只使用XAML并支持同时绑定元素的大小和位置属性。似乎当将设置了Stretch
或Center
对齐方式的WPF控件放置在Canvas内时,元素会“凝聚”于以(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没有描述的行为。