VisualState Класс
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Представляет визуальный вид элемента пользовательского интерфейса, если он находится в определенном состоянии. Визуальные состояния используют методы setters или раскадровку для задания свойств пользовательского интерфейса на страницах или шаблонах элементов управления, в которых VisualState определяется.
public ref class VisualState sealed : DependencyObject
/// [Microsoft.UI.Xaml.Markup.ContentProperty(Name="Storyboard")]
/// [Windows.Foundation.Metadata.Activatable(65536, "Microsoft.UI.Xaml.WinUIContract")]
/// [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 VisualState final : DependencyObject
[Microsoft.UI.Xaml.Markup.ContentProperty(Name="Storyboard")]
[Windows.Foundation.Metadata.Activatable(65536, "Microsoft.UI.Xaml.WinUIContract")]
[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 sealed class VisualState : DependencyObject
Public NotInheritable Class VisualState
Inherits DependencyObject
<VisualState x:Name="stateName" />
-or-
<VisualState x:Name="stateName">
singleStoryboard
</VisualState>
-or-
<VisualState x:Name="stateName">
<VisualState.Setters>
oneOrMoreSetters
</VisualState.Setters>
[optional]singleStoryboard
</VisualState>
-or-
<VisualState x:Name="stateName">
<VisualState.StateTriggers>
oneOrMoreTriggers
</VisualState.StateTriggers>
<VisualState.Setters>
oneOrMoreSetters
</VisualState.Setters>
[optional]singleStoryboard
</VisualState>
- Наследование
- Атрибуты
Примеры
В этом примере создается VisualStateGroup в элементе ControlTemplateкнопки с именем CommonStates и добавляются VisualState объекты для состояний, "Normal", "Pressed" и "PointerOver". Кроме Button того, определяется состояние с именем "Отключено", которое находится в "CommonStates" с именем VisualStateGroup, но в примере он не указывает на краткость.
<ControlTemplate TargetType="Button">
<Border x:Name="RootElement">
<VisualStateManager.VisualStateGroups>
<!--Define the states for the common states.
The states in the VisualStateGroup are mutually exclusive to
each other.-->
<VisualStateGroup x:Name="CommonStates">
<!--The Normal state is the state the button is in
when it is not in another state from this VisualStateGroup.-->
<VisualState x:Name="Normal" />
<!--Change the SolidColorBrush, BorderBrush, to red when the
Pointer is over the button.-->
<VisualState x:Name="PointerOver">
<Storyboard>
<ColorAnimation Storyboard.TargetName="BorderBrush"
Storyboard.TargetProperty="Color" To="Red" />
</Storyboard>
</VisualState>
<!--Change the SolidColorBrush, BorderBrush, to Transparent when the
button is pressed.-->
<VisualState x:Name="Pressed">
<Storyboard >
<ColorAnimation Storyboard.TargetName="BorderBrush"
Storyboard.TargetProperty="Color" To="Transparent"/>
</Storyboard>
</VisualState>
<!--The Disabled state is omitted for brevity.-->
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<Border.Background>
<SolidColorBrush x:Name="BorderBrush" Color="Black"/>
</Border.Background>
<Grid Background="{TemplateBinding Background}" Margin="4">
<ContentPresenter
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
Margin="4,5,4,4" />
</Grid>
</Border>
</ControlTemplate>
<Page>
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<VisualStateManager.VisualStateGroups>
<VisualStateGroup>
<VisualState>
<VisualState.StateTriggers>
<!-- VisualState to be triggered when window width is >=720 effective pixels -->
<AdaptiveTrigger MinWindowWidth="720"/>
</VisualState.StateTriggers>
<VisualState.Setters>
<Setter Target="myPanel.Orientation" Value="Horizontal"/>
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<StackPanel x:Name="myPanel" Orientation="Vertical">
<TextBlock x:Name="myTextBlock" MaxLines="5" Style="{ThemeResource BodyTextBlockStyle}"/>
</StackPanel>
</Grid>
</Page>
Комментарии
Элемент VisualState всегда должен содержаться в родительском элементе VisualStateGroup в разметке XAML. Имеет VisualStateGroup неявное свойство коллекции States, поэтому можно поместить каждый из них VisualState в качестве немедленного дочернего элемента родительского VisualStateGroup элемента. Рассмотрим пример.
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal"/>
<VisualState x:Name="PointerOver">...</VisualState>
<!-- do not need explicit VisualStateGroups.States property element, States is the XAML content property-->
</VisualStateGroup>
При использовании StateTriggers убедитесь, что VisualStateGroup объявляется под первым дочерним элементом корневого элемента, чтобы триггеры вступают в силу автоматически.
Состояние по умолчанию
Это юридический и распространенный для определения VisualStateатрибута x:Name , но не указывает ничего в раскадровке. Это полезно, так как такие VisualState значения будут использоваться в шаблоне по умолчанию. Затем можно запросить пустое состояние из вызова GoToState . Когда пустое состояние становится текущим, это отменяет все изменения свойств шаблона, сделанных предыдущим визуальным состоянием из той же VisualStateGroup.
При использовании StateTriggers больше не требуется для создания пустого VisualState для вызова GoToState . Если условия для StateTrigger больше не выполняются, все изменения свойств, сделанных соответствующими VisualState , автоматически удаляются, а значения, предоставленные в разметке по умолчанию, вступают в силу.
VisualState и x:Name
Метод GoToState (который обычно вызывается из кода элемента управления) требует stateName параметра, чтобы сообщить VisualStateManager , какое состояние следует использовать в качестве текущего состояния. Укажите атрибут x:Name для каждого VisualState из них, который потребуется применить вручную с помощью GoToState вызова из кода. Если вы используете StateTriggers для автоматического VisualState активации разметки, вам не нужно указывать атрибут x:Name в этом VisualState.
При использовании визуальных переходов значение VisualStateатрибута x:Name также ссылается на значения from или ToVisualTransition. В этом случае имя определяет состояние или состояния, которые VisualTransition предоставляют промежуточные значения между ними.
Значение атрибута x:Name , указанное для атрибута VisualState , должно быть уникальным в XAML шаблона элемента управления, где VisualState существует. Область для имен состояний не только для каждой VisualStateGroup, она ограничена всеми визуальными состояниями в шаблоне. Например, нельзя определить два разных состояния с именем "Фокус" в одном шаблоне XAML, даже если они находятся в разных группах.
Для имени визуального состояния или группы состояний визуальных элементов необходимо использовать атрибут x:Name ; Нерекомендаемый атрибут Name не будет работать.
VisualState и VisualStateGroup имеют Name свойство, но они доступны только для чтения. Это Name свойство существует для расширенных сценариев, использующих код для проверки содержимого шаблона элемента управления во время выполнения, а не для настройки из XAML.
Замена шаблона элемента управления существующего элемента управления
Если вы являетесь разработчиком приложений с помощью элемента управления в пользовательском интерфейсе приложения, можно заменить шаблон элемента управления, задав свойство Control.Template другим значением. Кроме того, вы можете заменить шаблон, объявив новый стиль, использующий неявный ключ стиля для этого элемента управления. Дополнительные сведения об этих понятиях см. в шаблонах элементов управления XAML.
При замене шаблона элемента управления важно воспроизвести все существующие именованные VisualState элементы из содержимого исходного шаблона VisualStateManager.VisualStateGroups элемента управления в XAML. Код элемента управления (который вы не изменяете) вызывает GoToState. Состояния с этими именами должны существовать в шаблоне элемента управления. Запрос на отсутствие VisualState исключений не вызывает исключений, но часто оставляет элемент управления в визуальном состоянии, которое будет запутано для пользователя. Например, если вы не предоставляете VisualState имя checked для элемента управления CheckBox , визуальный отзыв не отображается, когда пользователь выбирает элемент управления. Пользователь ожидает, что есть что-то визуально другое, чтобы отличить проверенное CheckBox от снятого CheckBox. Таким образом, неспособность воспроизвести визуальные состояния в части разработчика приложения сделает элемент управления неработает для пользователя.
При использовании интегрированной среды разработки, например Microsoft Visual Studio, действия, которые вы используете для замены шаблона элемента управления, предоставляют возможность начать с копии исходного шаблона XAML, чтобы увидеть все исходные именованные VisualState элементы и другую композицию элемента управления, которую вы заменяете. Лучше всего начать с копий шаблонов, а затем изменить их, чтобы случайно не опустить ожидаемое визуальное состояние из нового шаблона.
Добавление именованных визуальных состояний пользовательского элемента управления
Если вы определяете пользовательский элемент управления с визуальными состояниями в XAML-шаблоне элемента управления, рекомендуется атрибутировать класс элемента управления, чтобы указать потребителям, какие визуальные состояния доступны. Для этого примените один или несколько атрибутов TemplateVisualState на уровне класса кода определения элемента управления. Каждый атрибут должен указать атрибут x:Name состояния, который является stateName значением, которое потребитель элемента управления будет передавать в вызов GoToState для использования этого визуального состояния. Если это VisualState часть VisualStateGroup, это также должно быть указано в значениях атрибутов.
Конструкторы
| Имя | Описание |
|---|---|
| VisualState() |
Инициализирует новый экземпляр класса VisualState . |
Свойства
| Имя | Описание |
|---|---|
| Dispatcher |
Всегда возвращается |
| DispatcherQueue |
Возвращает, |
| Name |
Возвращает имя VisualState. |
| Setters |
Возвращает коллекцию объектов Setter , определяющих дискретные значения свойств, которые управляют внешним видом UIElements при применении этого VisualState . |
| StateTriggers |
Возвращает коллекцию объектов StateTriggerBase , указывающих, когда этот VisualState должен применяться. Если какие-либо (не все) триггеры активны, |
| Storyboard |
Возвращает или задает раскадровку , которая определяет значения свойств для конкретного состояния и внешний вид элемента управления при использовании этого визуального состояния. |
Методы
| Имя | Описание |
|---|---|
| ClearValue(DependencyProperty) |
Очищает локальное значение свойства зависимостей. (Унаследовано от DependencyObject) |
| GetAnimationBaseValue(DependencyProperty) |
Возвращает любое базовое значение, установленное для свойства зависимостей, которое будет применяться в случаях, когда анимация не активна. (Унаследовано от DependencyObject) |
| GetValue(DependencyProperty) |
Возвращает текущее эффективное значение свойства зависимостей из DependencyObject. (Унаследовано от DependencyObject) |
| ReadLocalValue(DependencyProperty) |
Возвращает локальное значение свойства зависимостей, если задано локальное значение. (Унаследовано от DependencyObject) |
| RegisterPropertyChangedCallback(DependencyProperty, DependencyPropertyChangedCallback) |
Регистрирует функцию уведомлений для прослушивания изменений в определенном экземпляре DependencyProperty в этом экземпляре DependencyObject . (Унаследовано от DependencyObject) |
| SetValue(DependencyProperty, Object) |
Задает локальное значение свойства зависимостей в DependencyObject. (Унаследовано от DependencyObject) |
| UnregisterPropertyChangedCallback(DependencyProperty, Int64) |
Отменяет уведомление об изменении, которое ранее было зарегистрировано путем вызова RegisterPropertyChangedCallback. (Унаследовано от DependencyObject) |