объект не вращается должным образом после преобразования translate в wpf?

#wpf #transform

#wpf #преобразование

Вопрос:

У меня есть canvas с несколькими элементами управления cutom, унаследованными от класса panel, динамически добавляемыми к нему во время выполнения с помощью rendertransform = (.5,.5). Но когда применяете translate transform (50,50) и поворачиваете его на 100 градусов, он не вращается на своем месте, он вращается в радиусе 50, почему? Я что-то делаю не так?

Ответ №1:

Преобразования не являются коммутативными, вы должны применить вращение перед применением преобразования.

Часто у вас есть TransformGroup, тогда вы можете просто изменить порядок его дочерних элементов, если это почему-то невозможно, потому что какое-то преобразование «унаследовано» от родителя, вы можете аннулировать предыдущие преобразования, используя их обратное преобразование (в случае преобразования, которое должно переместить цель обратно в начало координат), затем вы можете повернуть его на место и снова применить исходное преобразование.


Документация — ваш друг, вот что можно найти для TransformGroups :

В составном преобразовании важен порядок отдельных преобразований. Например, если вы сначала поворачиваете, затем масштабируете, затем переводите, вы получите другой результат, чем если бы вы сначала переводили, затем поворачивали, затем масштабировали. Одна из причин, по которой порядок важен, заключается в том, что преобразования, такие как поворот и масштабирование, выполняются относительно начала координат системы координат. Масштабирование объекта, центрированного в начале координат, приводит к другому результату, чем масштабирование объекта, который был удален от начала координат. Аналогично, вращение объекта, центрированного в начале координат, приводит к другому результату, чем вращение объекта, который был удален от начала координат.

Комментарии:

1. У меня есть оба преобразования в TransformGroup для применения RenderTransform

2. Есть ли возможность, что вы можете привести пример кода для этого решения, у меня такая же проблема, однако, поскольку я генерирую объекты «для поворота» в моем коде c # прямо из базы данных, любой пример xaml не имеет значения. И я не хочу публиковать дублирующий вопрос.

3. @ThrowingDwarf: «любой пример xaml не имеет значения», это какая-то бессмыслица. 1. В подавляющем большинстве случаев (как в этом) выполняется тривиальный и прямой перевод с XAML на C #. 2. WPF был разработан с учетом динамического и изменяющегося содержимого, следовательно, все его функции привязки данных и создания шаблонов, данные, поступающие из базы данных или API, не являются оправданием для отказа от XAML и написания спагетти-кода.

4. Причина этого в том, что положение и угол кнопок хранятся в базе данных. Кнопки генерируются во время выполнения. Они должны иметь возможность поворачивать ad move. И они делают и то, и другое, однако, когда я нажимаю на повернутую кнопку (например, против часовой стрелки на 90 градусов) в определенной позиции (например, слева вверху). На самом деле вы щелкаете по верхнему правому углу. Моя проблема в том, что кнопки перемещают курсор в положение, которое было бы нажато, если бы оно не было повернуто. Это может показаться немного расплывчатым, но это трудно объяснить.

5. И поскольку они (неизвестное количество) генерируются во время выполнения, у них нет жестко закодированного xaml. Все задано в c #.

Ответ №2:

Если он вращается с радиусом 50, это потому, что ваше происхождение неверно.

Вам просто нужно изменить происхождение вашего объекта, RotateTransform установив для CenterX свойств CenterY и 50 оба на в этом случае.

Комментарии:

1. Это не имеет эффекта, поскольку я применил rendertransform = (.5,.5)

2. Какими вы задали свойства CenterX и CenterY ?

3. ничего. Это работает, когда применяется rendertransformorigin=(.5,.5)