Позиционирование элемента внутри холста по центру (вместо верхнего левого угла) с использованием только XAML в WPF
общий вопрос о позиционировании элемент внутри Canvas
- " Как расположить центр элемента (вместо верхнего левого угла)".
- WPF: изменение размера круга, сохраняя центральную точку вместо TopLeft?
- эллипс Центра WPF на X, Y
- позиционирование элемента WPF на холсте
самое простое решение-разместить размер элемента во время установки Canvas.Left
и Canvas.Top
свойства программно. Это работает, но только один раз. Это решение не поддерживает привязки и будет нарушено при изменении размера элемента. Вы также не можете установить Canvas.Left
или Canvas.Top
используя
другой набор решений включает в себя преобразования translate с использованием либо RenderTransform
или Margin
. Эти решения требуют привязки некоторого свойства к the -0.5 * Width
или -0.5 * Height
. Такая привязка требует создания пользовательского ValueConverter
и невозможно создать, используя только XAML.
Итак, есть ли простой способ разместить элемент внутри холста так, чтобы его Canvas.Left
и Canvas.Top
соответствуют центру элемента, и свойства size и position могут быть привязаны к некоторым другим свойствам?
4 ответов
XAML и привязки кажутся очень мощными, но иногда возникают простые проблемы, требующие очень сложных решений. В моей библиотеке Привязок создать такую привязку было бы так же просто, как написать element.Center = position
или element.TopLeft = position - element.Size / 2
, но не позволяйте мне увлечься.
я нашел очень простое решение, которое использует только XAML и поддерживает привязку свойств size и position элемента. Кажется, что когда элемент управления WPF с выравниванием слишком Stretch
или Center
помещен внутри холста, элемент "гравитирует" к центрировать как (Canvas.Left, Canvas.Top)
точка (состояние, которое мы желаем), но останавливается "угловой пластиной", расположенной на том же
еще проще, по крайней мере для фигур, было бы использовать путь с соответствующей геометрией:
<Canvas>
<Path Canvas.Left="200" Canvas.Top="200" Fill="Red" Opacity="0.5">
<Path.Data>
<EllipseGeometry RadiusX="50" RadiusY="50"/>
</Path.Data>
</Path>
</Canvas>
Это решение сработало для меня центр текста в заданной точке на холсте WPF. Он использует MultiBinding и пользовательский конвертер для регулировки поля на своем элементе. Блестяще!
Я решил это, поместив холст в нижнюю правую ячейку сетки 2x2. Это делает координату 0,0 центром сетки, а затем вы можете сделать весь свой рисунок относительно этого.