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


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>
Наследование
Object Platform::Object IInspectable DependencyObject 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 ", визуальный отзыв не будет отображаться при выборе пользователем элемента управления. Пользователь ожидает, что есть что-то визуально отличающееся от проверенного CheckBoxCheckBox. Таким образом, если не воспроизвести визуальные состояния в части разработчика приложения, элемент управления будет казаться неисправным для пользователя.

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

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

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

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

VisualState()

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

Свойства

Dispatcher

Всегда возвращается null в приложении Windows App SDK. Вместо этого используйте DispatcherQueue .

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

Возвращает объект , DispatcherQueue с которым связан данный объект. DispatcherQueue представляет объект, который может получить доступ к потоку 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)

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

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