VisualState Класс
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Представляет внешний вид элемента пользовательского интерфейса, когда он находится в определенном состоянии. Визуальные состояния используют методы задания или раскадровку для задания свойств пользовательского интерфейса на страницах или в шаблонах элементов управления, где 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элемента Button с именем CommonStates и добавляются VisualState
объекты для состояний Normal, Pressed и PointerOver. Также Button
определяет состояние "Disabled", которое находится в "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 или Toобъекта VisualTransition. В этом случае имя определяет состояние или состояния, между которыми 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
для элемента управления CheckBox с именем " Checked ", визуальный отзыв не будет отображаться при выборе пользователем элемента управления. Пользователь ожидает, что есть что-то визуально отличающееся от проверенного CheckBox
CheckBox
. Таким образом, если не воспроизвести визуальные состояния в части разработчика приложения, элемент управления будет казаться неисправным для пользователя.
При использовании интегрированной среды разработки, такой как Microsoft Visual Studio, действия, используемые для замены шаблона элемента управления, предоставляют возможность начать с копии исходного шаблона XAML, чтобы вы могли видеть все исходные именованные VisualState
элементы и другую композицию элемента управления, которую вы заменяете. Лучше всего начать с копий шаблонов, а затем изменить их, чтобы случайно не пропустить ожидаемое визуальное состояние в новом шаблоне.
Атрибутирование именованных визуальных состояний пользовательского элемента управления
Если вы определяете пользовательский элемент управления с визуальными состояниями в XAML-коде шаблона элемента управления, рекомендуется атрибутировать класс элемента управления, чтобы указать потребителям элемента управления, какие визуальные состояния доступны. Для этого примените один или несколько атрибутов TemplateVisualState на уровне класса кода определения элемента управления. Каждый атрибут должен указывать атрибут состояния x:Name, который является stateName
значением, которое потребитель элемента управления будет передавать в вызове GoToState для использования этого визуального состояния.
VisualState
Если является частью VisualStateGroup, это также должно быть указано в значениях атрибута.
Конструкторы
VisualState() |
Инициализирует новый экземпляр класса VisualState . |
Свойства
Dispatcher |
Всегда возвращается |
DispatcherQueue |
Возвращает объект , |
Name |
Возвращает имя VisualState. |
Setters |
Возвращает коллекцию объектов Setter , определяющих дискретные значения свойств, управляющие внешним видом объектов UIElementпри применении этого 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) |