MSDN не рекомендует использовать EventTrigger и действительно любые настраиваемые действия триггера , но предлагает StoryBoard и VisualStateManager в качестве альтернативы.
Q1. Почему триггеры не поощряются, когда они кажутся такими полезными ?
Похоже, MSDN оправдывает:
EventTrigger и объект. Триггеры
использование элемента свойства на элементах
поддерживается Silverlight, но с использованием
эта техника не рекомендуется для
текущие приложения. EventTrigger может
поддерживать только запускающее действие для
Загруженное событие ( вы называете событие
в EventTrigger.RoutedEvent
свойство. ) Это делает EventTrigger
неподходящий для большинства времени выполнения
Взаимодействия.
Итак, можно назвать VisualState для VSM, но нельзя назвать событие? Оба являются строковыми значениями, которые могут потенциально меняться, так почему же наименование одного хуже другого?
Q2. Каков наилучший подход к анимации свойства объекта, значение которого зависит от значения свойства его контекста данных?
Конечно, VSM и StoryBoard отлично подходят для анимации, но они напрямую не взаимодействуют с контекстом данных объекта, не так ли?
Рассмотрим следующий сценарий для обсуждения:
Граница пути холста должна изменить цвет и толщину в зависимости от значения свойства IsSelected контекста данных холста. Щелчок левой кнопкой мыши на закрытой области Canvas Path должен переключить свойство IsSelected, которое также должно изменить анимацию Path и, в конечном итоге, цвет и толщину.
Подход 1
Возможно, я могу подключиться к событию взаимодействия (то есть MouseLeftButtonUp) и обновить значение свойства IsSelected в коде позади и запустить StoryBoard или изменить VisualState для анимации пути холста. Хотя это может быть хорошо с точки зрения анимации, она сильно связывает представление с моделью представления / контекстом данных, если я не приведу контекст данных к какому-либо интерфейсу IIsSelectable.
Подход 2
Возможно, я смогу создать поведение, которое переключает свойство IISelectable (упомянутое выше) и запускает StoryBoard или изменяет VisualState. Поскольку Canvas является элементом управления, вероятно, было бы лучше использовать VSM, а не просто StoryBoard (иначе мне бы пришлось как-то передать ссылку на StoryBoard поведению, возможно?).
Подход 3
Возможно, я могу использовать двустороннюю привязку с двойным преобразователем, чтобы начальная анимация Canvas Path определялась значением свойства IsSelected, но при взаимодействии с пользователем изменится анимация / VisualState, которая затем обновит значение свойства IsSelected. Если это так, могу ли я преобразовать свойство цвета / толщины границы пути холста или есть способ правильно преобразовать VisualState (в логическое значение IsSelected и из него)?
Это всего лишь несколько идей из головы. Любые другие предложения, которые были бы лучшими методами?