Ответ 1
XAML и привязки кажутся очень мощными, но иногда есть простые проблемы, требующие очень сложных решений. В моей библиотеке привязок, создающей такую привязку, было бы так же легко, как писать element.Center = position
или 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 не имеют описанного поведения.