VisualStateManager Класс
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Управляет визуальными состояниями и логикой перехода между визуальными состояниями для элементов управления. Также предоставляет поддержку VisualStateManager.VisualStateGroupsприсоединенного свойства, который определяет визуальные состояния в XAML для шаблона элемента управления.
/// [Windows.Foundation.Metadata.ContractVersion(Microsoft.UI.Xaml.WinUIContract, 65536)]
/// [Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
/// [Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
class VisualStateManager : DependencyObject
[Windows.Foundation.Metadata.ContractVersion(typeof(Microsoft.UI.Xaml.WinUIContract), 65536)]
[Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
[Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
public class VisualStateManager : DependencyObject
Public Class VisualStateManager
Inherits DependencyObject
- Наследование
- Атрибуты
Примеры
В этом примере показано, как использовать присоединенное VisualStateManager.VisualStateGroups свойство XAML. Обратите внимание, что в противном случае тег "VisualStateManager" не определен. Концептуально VisualStateManager.VisualStateGroups содержит визуальные состояния элемента управления в качестве немедленного дочернего тега корневого шаблона в шаблоне элемента управления.
Конкретный набор визуальных состояний содержит один VisualStateGroup с именем CommonStates, который определяет объекты PointerOver и Normal. Когда пользователь помещает указатель на кнопку, сетка изменяется с зеленого на красный в 5 секундах. Когда пользователь перемещает указатель от кнопки, сетка сразу же меняется на зеленую.
<ControlTemplate TargetType="Button">
<Grid >
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="CommonStates">
<VisualStateGroup.Transitions>
<!--Take one half second to transition to the PointerOver state.-->
<VisualTransition To="PointerOver"
GeneratedDuration="0:0:0.5"/>
</VisualStateGroup.Transitions>
<VisualState x:Name="Normal" />
<!--Change the SolidColorBrush, ButtonBrush, to red when the
Pointer is over the button.-->
<VisualState x:Name="PointerOver">
<Storyboard>
<ColorAnimation Storyboard.TargetName="ButtonBrush"
Storyboard.TargetProperty="Color" To="Red" />
</Storyboard>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<Grid.Background>
<SolidColorBrush x:Name="ButtonBrush" Color="Green"/>
</Grid.Background>
</Grid>
</ControlTemplate>
<common:LayoutAwarePage>
<Grid>
...
<VisualStateManager.VisualStateGroups>
<!-- Visual states reflect the application's window size -->
<VisualStateGroup>
<VisualState x:Name="DefaultLayout">
<Storyboard>
</Storyboard>
</VisualState>
<VisualState x:Name="Below768Layout">
<Storyboard>
<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(FrameworkElement.Margin)"
Storyboard.TargetName="ContentRoot">
<DiscreteObjectKeyFrame KeyTime="0">
<DiscreteObjectKeyFrame.Value>
<Thickness>20,20,20,20</Thickness>
</DiscreteObjectKeyFrame.Value>
</DiscreteObjectKeyFrame>
</ObjectAnimationUsingKeyFrames>
<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(FrameworkElement.HorizontalAlignment)"
Storyboard.TargetName="FooterPanel">
<DiscreteObjectKeyFrame KeyTime="0">
<DiscreteObjectKeyFrame.Value>
<HorizontalAlignment>Left</HorizontalAlignment>
</DiscreteObjectKeyFrame.Value>
</DiscreteObjectKeyFrame>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
</Grid>
</common:LayoutAwarePage>
Следующий фрагмент кода — это код для работы с XAML, показывающий, как приложение может обнаруживать ширину окна приложения и использовать эти сведения для вызова соответствующего визуального состояния.
String state = (Window.Current.Bounds.Width > 768) ? "DefaultLayout" : "Below768Layout";
VisualStateManager.GoToState(this, state, false); // 'this' is the LayoutAwarePage, scope is page code-behind
Комментарии
VisualStateManager поддерживает две важные функции для авторов элементов управления и для разработчиков приложений, которые применяют пользовательский шаблон к элементу управления:
- Авторы или разработчики приложений добавляют элементы объекта VisualStateGroup в корневой элемент определения шаблона элемента управления в XAML с помощью присоединенного
VisualStateManager.VisualStateGroupsсвойства. В элементеVisualStateGroupкаждый VisualState представляет дискретное визуальное состояние элемента управления. КаждыйVisualStateимеет имя, представляющее состояние пользовательского интерфейса, которое может быть изменено пользователем или изменено логикой элемента управления. AVisualStateсостоит в основном из раскадровки. ЭтоStoryboardпредназначено для изменения отдельных значений свойства зависимостей, которые должны применяться всякий раз, когда элемент управления находится в этом визуальном состоянии. - Управляйте переходом авторов или разработчиков приложений между этими состояниями путем вызова статического метода
VisualStateManagerGoToState. Авторы элементов управления выполняют это всякий раз, когда логика элемента управления обрабатывает события, указывающие на изменение состояния, или логика управления инициирует изменение состояния самостоятельно. Код определения элемента управления чаще всего используется для этого, а не для кода приложения, поэтому все возможные визуальные состояния и их переходы и условия триггера существуют по умолчанию для кода приложения, а логика инкапсулируется элементом управления.
Большинство разработчиков будут использовать только два VisualStateManager API: VisualStateManager.VisualStateGroupsи GoToState, как описано выше. Остальные API предназначены для поддержки расширений и создания пользовательского VisualStateManagerинтерфейса. Дополнительные сведения см. в разделе "Custom VisualStateManager" в этом разделе.
При редактировании копий стилей, включенных областью конструктора XAML Microsoft Visual Studio, визуальные состояния из шаблона по умолчанию определяются в xaml, который вы редактируете. Не удаляйте эти состояния или не изменяйте их имена, так как логика управления ожидает, что эти визуальные состояния существуют в шаблоне.
Помимо визуальных состояний модель визуального состояния также включает переходы. Переходы — это действия анимации, управляемые раскадровкой , которая происходит между каждым визуальным состоянием при изменении состояния. Переход можно определить по-разному для каждого сочетания начального состояния и конечного состояния, как определено набором визуальных состояний элемента управления. Переходы определяются свойством VisualStateGroupTransitions в XAML с помощью синтаксиса элемента свойства. Большинство шаблонов элементов управления по умолчанию не определяют переходы. В отсутствие специально определенных переходов переходы между состояниями происходят мгновенно (нулевой продолжительности). Дополнительные сведения см. в разделе VisualTransition.
Custom VisualStateManager
Если вы хотите реализовать собственную логику для переходов между состояниями (расширенный сценарий), можно создать класс, наследующий от VisualStateManager. Следуйте приведенным ниже рекомендациям:
- Производный класс должен переопределить защищенный метод GoToStateCore . Любой экземпляр настраиваемого использует
VisualStateManagerэту логику Core при вызове метода GoToState . - Чтобы ссылаться на пользовательский
VisualStateManagerкласс, задайте значение присоединенногоVisualStateManager.CustomVisualStateManagerсвойства в корневом элементе Элемента ControlTemplate , где требуется использовать поведение пользовательскогоVisualStateManagerкласса, а такжеVisualStateManager.VisualStateGroupsиспользование присоединенного свойства, определяющее визуальные состояния шаблона. Обычно создается экземпляр пользовательскогоVisualStateManagerкласса с помощью построения XAML по умолчанию в Application.Resources. Затем присоединенноеVisualStateManager.CustomVisualStateManagerсвойство задается с помощью расширения разметки {StaticResource} к ключу пользовательскогоVisualStateManagerресурса.
Это основные требования для создания и использования пользовательского VisualStateManager. Вы также можете переопределить несколько других действий:
- Переопределите RaiseCurrentStateChanged, чтобы управлять событием CurrentStateChanged, управляемым
VisualStateManagerVisualStateGroup. - Переопределите RaiseCurrentStateChanging, чтобы управлять событием CurrentStateChanging, управляемым
VisualStateManagerVisualStateGroup. - Переопределите или перезагрузите конструктор, если для инициализации пользовательского класса требуется дополнительная информация.
Все остальные API (CustomVisualStateManagerProperty, GetCustomVisualStateManager, GetVisualStateGroups, SetCustomVisualStateManager) являются инфраструктурой для поддержки присоединенных свойств, и вам не нужно вызывать их или делать с ними ничего.
Визуальные состояния для элементов, которые не являются элементами управления
Визуальные состояния иногда полезны для сценариев, когда требуется изменить состояние определенной области пользовательского интерфейса, которая не сразу подкласс Control . Это невозможно сделать напрямую, так как для параметра элемента управления метода GoToState требуется Control подкласс, который ссылается на объект, на который действует VisualStateManager.
Страница является подклассом Control , и это довольно редко, что вы будете отображать пользовательский интерфейс в контексте, где у вас нет Pageкорневого каталога Window.Content , не является подклассом Control . Мы рекомендуем определить пользовательский userControl как корневой, так Window.Content и контейнер для другого содержимого, к которому нужно применить состояния (например , панель). Затем вы можете вызвать GoToState в ваших UserControl и применить состояния независимо от того, является Controlли остальная часть содержимого. Например, можно применить визуальные состояния к пользовательскому интерфейсу, которое в противном случае состоит только из буфераChainPanel , если вы помещали его в свои UserControl и объявленные именованные состояния, которые применяются к свойствам родительского UserControl или именованной SwapChainPanel части шаблона.
Присоединенные свойства XAML
VisualStateManager — это класс службы узла для нескольких присоединенных свойств XAML.
Для поддержки доступа процессора XAML к присоединенным свойствам, а также для предоставления эквивалентных операций получения и задания кода каждое присоединенное свойство XAML имеет пару Get методов доступа и Set методов доступа. Другой способ получить или задать значение в коде — использовать систему свойств зависимостей, вызывая GetValue или SetValue и передав поле идентификатора в качестве идентификатора свойства зависимостей.
| Присоединенное свойство | Описание |
|---|---|
| VisualStateGroups | Возвращает коллекцию элементов VisualStateGroup, определенных корневым элементом определения шаблона. Элемент управления обычно определяет это как часть шаблона.
При получении этого свойства в коде используйте GetVisualStateGroups. Возвращает объект коллекции, в который можно добавить элементы. Это параллелирует поведение обработки XAML для всех дочерних элементов элемента свойства VisualStateManager.VisualStateGroups. Так как для этого конкретного присоединенного свойства нет идентификатора общедоступного свойства зависимостей, вы не можете использовать GetValue для получения этого значения присоединенного свойства, вам всегда нужно использовать GetVisualStateGroups. |
| CustomVisualStateManager | Возвращает или задает пользовательский объект VisualStateManager, который обрабатывает переходы между состояниями элемента управления.
Это присоединенное свойство требуется только в тех случаях, когда вы хотите использовать пользовательский класс реализации для обработки изменений визуального состояния приложения, а не класса VisualStateManager по умолчанию, реализованного среда выполнения Windows. Если вы не планируете использовать пользовательскую реализацию, вам не нужно задавать это свойство. |
Конструкторы
| Имя | Описание |
|---|---|
| VisualStateManager() |
Инициализирует новый экземпляр класса VisualStateManager . |
Свойства
| Имя | Описание |
|---|---|
| CustomVisualStateManagerProperty |
Определяет свойство зависимостей VisualStateManager.CustomVisualStateManager . |
| Dispatcher |
Всегда возвращается |
| DispatcherQueue |
Возвращает, |
Присоединенные свойства
| Имя | Описание |
|---|---|
| CustomVisualStateManager |
Возвращает или задает пользовательский объект VisualStateManager, который обрабатывает переходы между состояниями элемента управления. |
Методы
| Имя | Описание |
|---|---|
| ClearValue(DependencyProperty) |
Очищает локальное значение свойства зависимостей. (Унаследовано от DependencyObject) |
| GetAnimationBaseValue(DependencyProperty) |
Возвращает любое базовое значение, установленное для свойства зависимостей, которое будет применяться в случаях, когда анимация не активна. (Унаследовано от DependencyObject) |
| GetCustomVisualStateManager(FrameworkElement) |
Возвращает значение присоединенного свойства VisualStateManager.CustomVisualStateManager . |
| GetValue(DependencyProperty) |
Возвращает текущее эффективное значение свойства зависимостей из DependencyObject. (Унаследовано от DependencyObject) |
| GetVisualStateGroups(FrameworkElement) |
Извлекает коллекцию объектов VisualStateGroup , связанных с указанным FrameworkElement. |
| GoToState(Control, String, Boolean) |
Перемещает элемент управления между двумя состояниями, запрашивая новый VisualState по имени. |
| GoToStateCore(Control, FrameworkElement, String, VisualStateGroup, VisualState, Boolean) |
При переопределении в производном классе перемещает элемент управления между состояниями. |
| RaiseCurrentStateChanged(VisualStateGroup, VisualState, VisualState, Control) |
При переопределении в производном классе запускает событие CurrentStateChanged в указанной VisualStateGroup. |
| RaiseCurrentStateChanging(VisualStateGroup, VisualState, VisualState, Control) |
При переопределении в производном классе активирует событие CurrentStateChanging в указанной VisualStateGroup. |
| ReadLocalValue(DependencyProperty) |
Возвращает локальное значение свойства зависимостей, если задано локальное значение. (Унаследовано от DependencyObject) |
| RegisterPropertyChangedCallback(DependencyProperty, DependencyPropertyChangedCallback) |
Регистрирует функцию уведомлений для прослушивания изменений в определенном экземпляре DependencyProperty в этом экземпляре DependencyObject . (Унаследовано от DependencyObject) |
| SetCustomVisualStateManager(FrameworkElement, VisualStateManager) |
Задает значение присоединенного свойства VisualStateManager.CustomVisualStateManager . |
| SetValue(DependencyProperty, Object) |
Задает локальное значение свойства зависимостей в DependencyObject. (Унаследовано от DependencyObject) |
| UnregisterPropertyChangedCallback(DependencyProperty, Int64) |
Отменяет уведомление об изменении, которое ранее было зарегистрировано путем вызова RegisterPropertyChangedCallback. (Унаследовано от DependencyObject) |