Вращение UX в простом WPF работает как положено, завершается неудачно при реализации в MVVM - PullRequest
0 голосов
/ 22 апреля 2019

У меня есть рабочий прототип для вращающегося элемента 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 естественным образом распространяется вниз, выбрасывая элементы управления.

1 Ответ

0 голосов
/ 23 апреля 2019

Проблема, скорее всего, связана с установкой DataContext на Image. То, как вы это делаете, создаст новый экземпляр класса MainViewModel, который , вероятно, не то, что вам нужно. Как правило, DataContext устанавливается на уровне Window или UserControl, и ему разрешено «течь» через органы управления.

Скорее всего, вам нужно связать DataContext со свойством, а не создавать новое.

Если вы опубликуете больше информации о вашем контроле и его основной модели представления, мы могли бы помочь вам в дальнейшем.


Если бы мне пришлось угадывать прямо сейчас, из вашего текущего кода правильная привязка могла бы выглядеть примерно так:

<Image x:Name="Compass" 
       RenderTransformOrigin="0.5,0.5" 
       DataContext={Binding Path=SomeCompassViewModelPropertyOnYourMainViewModel" >
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...