VisualStateGroup 类

定义

包含互斥 的 VisualState 对象和用于从一个状态转到另一个状态的 VisualTransition 对象。

public ref class VisualStateGroup sealed : DependencyObject
/// [Microsoft.UI.Xaml.Markup.ContentProperty(Name="States")]
/// [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 VisualStateGroup final : DependencyObject
[Microsoft.UI.Xaml.Markup.ContentProperty(Name="States")]
[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 VisualStateGroup : DependencyObject
Public NotInheritable Class VisualStateGroup
Inherits DependencyObject
<VisualStateManager.VisualStateGroups>
   <VisualStateGroup x:Name="groupname" ...>
     oneOrMoreVisualStates
   </VisualStateGroup>
   <!--- other peer VisualStateGroup's here ... -->
</VisualStateManager.VisualStateGroups>
继承
Object Platform::Object IInspectable DependencyObject VisualStateGroup
属性

示例

此示例为包含一个 Grid按钮创建一个简单的 ControlTemplate。 它还包含一个名为 VisualStateGroup “CommonStates”的 ,它定义“PointerOver”和“Normal”状态。 VisualStateGroup还有一个 VisualTransition,它指定当用户将指针放在 上Button时,需要半秒才能Grid使 从绿色更改为红色。

<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>

注解

在 XAML 中声明为控件模板的一部分的每个 VisualStateGroup 应始终在控件模板上设置 x:Name 属性 。 控件模板的 集合 VisualStateGroups 中使用的每个名称字符串在控件模板中必须是唯一的。 不过,对不同的控件使用相同的组名称很常见。 例如,几乎所有现有控件模板都有 VisualStateGroup 带有 x:Name attribute “CommonStates”的 。

每个 VisualStateGroup 组中的视觉状态集应互斥。 换句话说,控件应始终保持使用其每个已定义 VisualStateGroup 组中的视觉状态之一。 每当控件打算同时处于两种状态的情况下,请确保这两种状态位于不同的组中。 例如,下拉控件可以同时聚焦并打开其下拉列表。 在正确的视觉状态设计中,每个状态都有一个单独的 VisualStateGroup ,以便它们一次处于活动状态。 此类组的名称可能类似于“FocusStates”和“DropDownStates”。

每当定义 VisualStateGroup 在其 VisualState 元素之一中启用临时情节提要行为的 时,请确保该组还包含可调用以取消先前状态的第二 VisualState 个。 这可以像声明第二 VisualState 个根本没有 情节提要 (仅声明 x:Name 属性)一样简单。

为 设置的 VisualStateGroupx:Name 属性值不用于对 VisualStateManager.GoToState 的调用;而是x:Name attribute用于 VisualStateManager.GoToStateVisualState 的 。 使用 VisualStateManager.GoToState 的任何人都应了解所有可用的组和状态,以便每个调用都能正确地从组内的旧状态转换为新状态。

除了一组 VisualState 元素之外, VisualStateGroup 还可以定义一组 VisualTransition 元素,其中每个 VisualTransition 元素都与组中定义的至少一个命名 VisualState 元素相关。 在 XAML 中,元素集 VisualState 可以声明为 的 VisualStateGroup直接对象元素子元素。 这是可能的,因为 States 属性(视觉状态的集合)是 的 VisualStateGroupXAML 内容属性。 相反,若要设置视觉转换的集合,必须在 XAML 中的 VisualStateGroup.Transitions 属性元素中声明该集合。 有关 XAML 内容属性的详细信息,请参阅 XAML 语法指南

使用 StateTriggers 控制视觉状态时,触发器引擎使用以下优先规则对触发器进行评分,并确定哪个触发器和相应的 VisualState 将处于活动状态:

  1. 派生自 StateTriggerBase 的自定义触发器
  2. AdaptiveTriggerMinWindowWidth 而激活
  3. AdaptiveTrigger 由于 MinWindowHeight 而激活

如果一次有多个活动触发器在评分 ((即) 两个活动的自定义触发器)发生冲突,则标记文件中声明的第一个触发器优先。

注意:尽管 AdaptiveTrigger 派生自 StateTriggerBase,但只能通过设置 MinWindowWidth 和/或 MinWindowHeight 来激活它。

VisualStateGroup 支持自定义 VisualStateManager 实现的 API

的许多 API VisualStateGroup 存在只是为了支持自定义 VisualStateManager 实现。 其中包括: NameCurrentStateCurrentStateChangingCurrentStateChanged。 控件模板的视觉状态的最常见用法不需要这些 API。 具体而言,处理事件并不常见。 控件的大多数逻辑操作应涉及其自己的属性和事件。 对于大多数应用和控件定义方案,发生在控件上的视觉状态更改应只是控件应用于其模板的逻辑的最终结果,而不是其他逻辑的触发器。

构造函数

VisualStateGroup()

初始化 VisualStateGroup 类的新实例。

属性

CurrentState

从成功调用 GoToState 方法获取最近设置的 VisualState

Dispatcher

始终在Windows 应用 SDK应用中返回 null 。 请改用 DispatcherQueue

(继承自 DependencyObject)
DispatcherQueue

获取 DispatcherQueue 与此 对象关联的 。 DispatcherQueue表示可以访问 DependencyObject UI 线程上的 的功能,即使代码是由非 UI 线程启动的。

(继承自 DependencyObject)
Name

获取 VisualStateGroup 的名称。

States

获取互斥 VisualState 对象的集合。

Transitions

获取 VisualTransition 对象的集合。

方法

ClearValue(DependencyProperty)

清除依赖属性的本地值。

(继承自 DependencyObject)
GetAnimationBaseValue(DependencyProperty)

返回为依赖属性建立的任何基值,该基值适用于动画未处于活动状态的情况。

(继承自 DependencyObject)
GetValue(DependencyProperty)

DependencyObject 返回依赖属性的当前有效值。

(继承自 DependencyObject)
ReadLocalValue(DependencyProperty)

如果设置了本地值,则返回依赖属性的本地值。

(继承自 DependencyObject)
RegisterPropertyChangedCallback(DependencyProperty, DependencyPropertyChangedCallback)

注册一个通知函数,用于侦听此 DependencyObject 实例上特定 DependencyProperty 的更改。

(继承自 DependencyObject)
SetValue(DependencyProperty, Object)

设置 DependencyObject 上依赖属性的本地值。

(继承自 DependencyObject)
UnregisterPropertyChangedCallback(DependencyProperty, Int64)

取消以前通过调用 RegisterPropertyChangedCallback 注册的更改通知。

(继承自 DependencyObject)

事件

CurrentStateChanged

在控件更改为其他状态后发生。

CurrentStateChanging

当控件开始更改为不同的状态时发生。

适用于

另请参阅