Поделиться через


VisualState Класс

Определение

Представляет внешний вид элемента пользовательского интерфейса, если он находится в определенном состоянии. Визуальные состояния используют методы задания или раскадровки для задания свойств пользовательского интерфейса на страницах или в шаблонах элементов управления, в которых определен VisualState.

public ref class VisualState sealed : DependencyObject
/// [Windows.Foundation.Metadata.Activatable(65536, Windows.Foundation.UniversalApiContract)]
/// [Windows.Foundation.Metadata.ContractVersion(Windows.Foundation.UniversalApiContract, 65536)]
/// [Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
/// [Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
/// [Windows.UI.Xaml.Markup.ContentProperty(Name="Storyboard")]
class VisualState final : DependencyObject
/// [Windows.Foundation.Metadata.ContractVersion(Windows.Foundation.UniversalApiContract, 65536)]
/// [Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
/// [Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
/// [Windows.UI.Xaml.Markup.ContentProperty(Name="Storyboard")]
/// [Windows.Foundation.Metadata.Activatable(65536, "Windows.Foundation.UniversalApiContract")]
class VisualState final : DependencyObject
[Windows.Foundation.Metadata.Activatable(65536, typeof(Windows.Foundation.UniversalApiContract))]
[Windows.Foundation.Metadata.ContractVersion(typeof(Windows.Foundation.UniversalApiContract), 65536)]
[Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
[Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
[Windows.UI.Xaml.Markup.ContentProperty(Name="Storyboard")]
public sealed class VisualState : DependencyObject
[Windows.Foundation.Metadata.ContractVersion(typeof(Windows.Foundation.UniversalApiContract), 65536)]
[Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
[Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
[Windows.UI.Xaml.Markup.ContentProperty(Name="Storyboard")]
[Windows.Foundation.Metadata.Activatable(65536, "Windows.Foundation.UniversalApiContract")]
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>
Наследование
Object Platform::Object IInspectable DependencyObject VisualState
Атрибуты

Требования к Windows

Семейство устройств
Windows 10 (появилось в 10.0.10240.0)
API contract
Windows.Foundation.UniversalApiContract (появилось в v1.0)

Примеры

В этом примере создается объект VisualStateGroup в элементе ControlTemplateэлемента Button с именем CommonStates и добавляются объекты VisualState для состояний Normal, Pressed и PointerOver. Кнопка также определяет состояние "Отключено", которое находится в "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.

При использовании визуальных переходов на значение атрибута x:Name объекта VisualState также ссылаются значения From или Toобъекта VisualTransition. В этом случае имя определяет состояние или состояния, между которыми VisualTransition предоставляет промежуточные значения.

Значение атрибута x:Name , указанное для VisualState, должно быть уникальным в xaml-коде шаблона элемента управления, в котором существует VisualState. Область для имен состояний не только ограничивается каждой группой VisualStateGroup, но и всеми визуальными состояниями в шаблоне. Например, нельзя определить два разных состояния с именем "Отсортированные" в одном xaml-коде шаблона, даже если они находятся в разных группах.

Для присвоения имени визуальному состоянию или группе состояний визуальных элементов необходимо использовать атрибут x:Name ; Нерекомендуемый атрибут Name не будет работать. VisualState и VisualStateGroup имеют свойство Name , но они доступны только для чтения. Это свойство Name существует для расширенных сценариев, использующих код для проверки содержимого шаблона элемента управления во время выполнения, а не для задания из XAML.

Замена шаблона существующего элемента управления

Если вы являетесь разработчиком приложения, использующим элемент управления в пользовательском интерфейсе приложения, вы можете заменить шаблон элемента управления, задав для свойства Control.Template другое значение. Или можно заменить шаблон, объявив новый стиль, который использует ключ неявного стиля для этого элемента управления. Дополнительные сведения об этих понятиях см. в статье Краткое руководство. Шаблоны элементов управления.

При замене шаблона элемента управления важно воспроизвести все существующие элементы VisualState из содержимого VisualStateManager.VisualStateGroups исходного шаблона элемента управления в XAML. Код элемента управления (который вы не изменяете) вызывает GoToState. Состояния с этими именами должны существовать в шаблоне элемента управления. Запрос на отсутствующий VisualState не вызывает исключений, но часто оставляет элемент управления в визуальном состоянии, которое будет сбивать с толку пользователя. Например, если не указать VisualState с именем "Checked" для элемента управления CheckBox , визуальные отзывы не будут отображаться при выборе элемента управления пользователем. Пользователь ожидает, что есть что-то визуально отличающееся от флажка CheckBox. Таким образом, если не воспроизвести визуальные состояния на стороне разработчика приложения, элемент управления будет казаться неисправным для пользователя.

При использовании интегрированной среды разработки, такой как Microsoft Visual Studio, действия, используемые для замены шаблона элемента управления, позволяют начать с копии исходного шаблона XAML, чтобы вы могли видеть все исходные именованные элементы VisualState и другую композицию элемента управления, которую вы заменяете. Лучше всего начать с копирования шаблонов, а затем изменить их, чтобы случайно не опустить ожидаемое визуальное состояние в новом шаблоне.

Атрибут именованных визуальных состояний пользовательского элемента управления

Если вы определяете пользовательский элемент управления с визуальными состояниями в xaml-коде шаблона элемента управления, рекомендуется атрибутировать класс элемента управления, чтобы указать потребителям, какие визуальные состояния доступны. Для этого примените один или несколько атрибутов TemplateVisualState на уровне класса кода определения элемента управления. Каждый атрибут должен указывать атрибут состояния x:Name, который является значением stateName , которое потребитель элемента управления будет передавать в вызове GoToState для использования этого визуального состояния. Если VisualState является частью VisualStateGroup, это также должно быть указано в значениях атрибутов.

Конструкторы

VisualState()

Инициализирует новый экземпляр класса VisualState .

Свойства

Dispatcher

Возвращает объект CoreDispatcher , с которым связан этот объект. CoreDispatcher представляет собой средство, которое может получить доступ к DependencyObject в потоке пользовательского интерфейса, даже если код инициируется потоком, не относящегося к пользовательскому интерфейсу.

(Унаследовано от DependencyObject)
Name

Возвращает имя Объекта VisualState.

Setters

Возвращает коллекцию объектов Setter , определяющих дискретные значения свойств, которые управляют внешним видом объектов UIElementпри применении этого visualState .

StateTriggers

Возвращает коллекцию объектов StateTriggerBase , которые указывают, когда следует применить этот объект VisualState . Если активны какие-либо (не все) триггеры, будет применено значение 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)

Применяется к

См. также раздел