Зачем использовать VisualStateManager и (не в конечном итоге) использовать триггеры?
Давайте начнем с общих различий между ними.
- Как они стреляют:
- Триггеры срабатывают, когда свойство меняет свое значение .
- VisualStates запускаются, когда элемент управления запрашивает состояние из группы состояний .
- Действие, которое они выполняют при увольнении:
- Триггеры:
- Создание через
Setter
какого-либо другого имущества.
- VisualState :
- Инициирует запрос на изменение статуса на
VisualStateManager
.
VisualStateManager
выполняет VisualTransition
перед установкой состояния.
VisualTransition
выполняет Storyboard
.
- По истечении времени, указанного в
GeneratedDuration
(из VisualTransition
), VisualStateManager
обновляет свойство CurrentState
соответствующего VisualStateGroup
элемента управления.
- Далее
VisualStateManager
выполняет начальный VisualState
, запрошенный в (1).
- И, наконец,
VisualState
выполняет еще один Storyboard
.
И да, вы правы, полагая, что VisualStateManager делает сценарий более сложным, чем триггеры. Однако сложность VisualStateManager позволяет программисту делать вещи, которые триггеры не могут делать (не простым способом):
- Различие между состоянием и переходом между состояниями:
- Создание анимации во время изменения состояния независимо от самого состояния без создания другого дополнительного свойства.
- Разрешить повторное использование одного и того же перехода путем правильной установки команд
From
и To
для VisualTransition
.
- Автоматическое управление визуальными проблемами и анимацией (например, остановка анимации перехода и активация другой в середине перехода).
- Легко добавлять / редактировать / поддерживать / удалять сложные анимации, что облегчает программирование в сложных сценариях.
Дает большую свободу в способе запуска VisualState: , поскольку его можно сделать с измененным свойством, событиями, методами и т. Д. Даже (это самая волшебная вещь) без выхода из xaml , используя Behavior
правильно.
Реализация нескольких состояний и переходов состояний одновременно: , поскольку вы можете назначить набор групп состояний для элемента управления (a VisualStateGroup
), и каждая группа состояний имеет уникальный CurrentState
в данное время. Возможно изображение говорит это лучше всего:
![State-Based Navigation QuickStart Using the Prism Library 5.0 for WPF](https://i.stack.imgur.com/etYU4.png)
Естественная интеграция с WPF: , поскольку неявно, контроль - это тот, который обрабатывает состояния и позволяет управлять состояниями в виде своего рода дерева элементов управления (parent-control) ), то, что естественно происходит в WPF. Это позволяет вам генерировать очень сложные сценарии всего за пару строк; и, конечно же, не касаясь кода позади элемента управления.
И я уверен, что есть и другие преимущества. Самое интересное, что если вы хотите использовать некоторые из этих преимуществ самостоятельно, используя триггеры, вы в конечном итоге попадете в систему, очень похожую на VisualStateManager ... попробуйте!
Однако ... не всегда хорошо использовать VisualStateManager
Даже при всех этих преимуществах система Trigger не должна сбрасываться системой VisualStateManager. Триггеры - более простая система, но она также имеет свой потенциал.
Лично я бы использовал триггеры для очень простых «примитивных» элементов управления, которые не требуют странного поведения или странной анимации. В этом типе элементов управления сложность реализации VisualStateManager не оправдывает его использование.
Для более сложных элементов управления я бы использовал VisualStateManager, особенно для тех «сложных» элементов управления, которые используют другие «примитивные» элементы управления ( обратите внимание на значение понятий «примитивный» и «сложный» ),Естественно, эти элементы управления имеют сложное поведение в зависимости от взаимодействия с пользователем.