У меня есть рабочий прототип для вращающегося элемента Compass UX в приложении WPF. У меня есть код позади, и математика проработана, чтобы захватить мышь, и повернуть компас с помощью мыши вниз, чтобы север всегда следовал за положением мыши. Это отдельный объект UserControl, который я объявляю на главной странице Xaml, где я подключаюсь к различным нужным мне событиям. Этот пост - это то, как я сделал код, а , этот - как я связал свойство Angle, чтобы логика приложения могла установить значение без какого-либо прямого ввода в элемент управления.
Недавно я начал переносить свой прототип в производственный репозиторий, который организован в шаблон MVVM. У меня есть простые события щелчка, связанные с правильными командами, но UX не вращается теперь, когда он находится в новом, производственном проекте. Печать с консоли показывает, что моя мышь захвачена, а задний код достигает точного ожидаемого угла, который я хочу применить к UX, но он не меняется.
Я перепробовал несколько альтернативных подходов, но ничего не изменилось. Сначала я попытался объявить свойство зависимости в моей модели представления без изменений. Я также попытался создать RotateTransform и напрямую установить RenderTransform элемента управления, но это создает очень хаотичное поведение (но оно начинает вращаться!)
Подключение к MainViewModel и настройка привязки TwoWay - новинка для моего проекта MVVM, закомментированная строка показывает, как у меня есть рабочая привязка в моем прототипе.
<Image x:Name="Compass" RenderTransformOrigin="0.5,0.5" >
<Image.DataContext>
<p:MainViewModel/>
</Image.DataContext>
<Image.RenderTransform>
<RotateTransform Angle="{Binding BearingAngle, Mode=TwoWay}"/>
<!--RotateTransform Angle="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type p:CompassView}}, Path=Angle}"/-->
</Image.RenderTransform>
</Image>
Код, который работает, имеет следующий DependencyProperty.
public static readonly DependencyProperty AngleProperty =
DependencyProperty.Register("Angle", typeof(double), typeof(CompassControl), new UIPropertyMetadata(0.0));
public double Angle
{
get { return (double)GetValue(AngleProperty); }
set { SetValue(AngleProperty, value); }
}
Самое близкое к тому, что мне нужно, чтобы получить какое-либо движение в проекте MVVM, устанавливает преобразование следующим образом (ПРИМЕЧАНИЕ. Это приводит к тому, что мой поворот мерцает на 90-180 градусов не в фазе с, казалось бы, случайным углом, не имеет никакого шаблона для следования курсор):
this.RenderTransform = new RotateTransform(this.Angle, knobCenter.X, knobCenter.Y);
В конечном счете, производственное репо, организованное как MVVM, может быть красной сельдью, и я упускаю из виду кое-что еще, но, поскольку я относительно неопытен, как MVVM должен работать, это мое единственное указание на то, почему он не работает в этом проект, но хорошо в демонстрационном примере.
ОБНОВЛЕНИЕ: Оказывается, моя проблема не была связана со всем этим. Родительский элемент управления, который создал мой Compass, перезаписывал свойство Image (вместе с его RenderTransform) пользовательским типом Image, в результате чего RenderTransform, которой я пытался манипулировать, был неправильным. Я объявил мой Compass этого пользовательского типа и удалил перезаписывающий код в родительском элементе управления, и все снова заработало, как и ожидалось. Поскольку этот родительский элемент управления выполнял всю привязку для моих пользовательских команд без какой-либо прямой ссылки на DataContext или ViewModel, простой привязки было достаточно, чтобы все могли видеть друг друга там, где они мне нужны. Я полагаю, что я получал странное поведение, пытаясь навязать некоторые привязки, как я должен был в «простом» приложении, против того, чтобы полностью использовать то, как ViewModel естественным образом распространяется вниз, выбрасывая элементы управления.