Лучшие практики запуска триггеров в Silverlight - PullRequest
1 голос
/ 22 марта 2011

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 и из него)?


Это всего лишь несколько идей из головы. Любые другие предложения, которые были бы лучшими методами?

1 Ответ

1 голос
/ 22 марта 2011

Q1: EventTrigger и System.Windows.TriggerAction не рекомендуется. Ссылка, которую вы даете на "они кажутся такими полезными?" предназначен для System.Windows.Interactivity.TriggerAction, использование которого приветствуется, поскольку поддерживается в проектах Blend SL и может использоваться не только для события Loaded.

Q2: Вы можете привязать данные To к значению анимации, но вместо этого я рассмотрю возможность создания настраиваемого шаблонного элемента управления. Таким образом, вы можете определить, что изменения свойства IsSelected изменяют состояния VSM элемента управления.

...