VisualStateGroup 类
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
包含互斥 的 VisualState 对象和用于从一个状态转到另一个状态的 VisualTransition 对象。
public ref class VisualStateGroup 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="States")]
class VisualStateGroup 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="States")]
/// [Windows.Foundation.Metadata.Activatable(65536, "Windows.Foundation.UniversalApiContract")]
class VisualStateGroup 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="States")]
public sealed class VisualStateGroup : 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="States")]
[Windows.Foundation.Metadata.Activatable(65536, "Windows.Foundation.UniversalApiContract")]
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>
- 继承
- 属性
Windows 要求
设备系列 |
Windows 10 (在 10.0.10240.0 中引入)
|
API contract |
Windows.Foundation.UniversalApiContract (在 v1.0 中引入)
|
示例
此示例为包含一个 Grid 的按钮创建一个简单的 ControlTemplate。 它还包含一个名为“CommonStates”的 VisualStateGroup,用于定义“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 属性 为“CommonStates”。
每个 VisualStateGroup 中的视觉状态集应在组中互斥。 换句话说,控件应始终保持使用其每个定义的 VisualStateGroup 组中的视觉状态之一。 每当控件打算同时处于两种状态的情况下,请确保这两种状态位于不同的组中。 例如,下拉控件可以同时聚焦并打开其下拉列表。 在正确的视觉状态设计中,每个状态都有一个单独的 VisualStateGroup,以便它们可以同时处于活动状态。 此类组的名称可能类似于“FocusStates”和“DropDownStates”。
每当定义在其 VisualState 元素之一中启用临时情节提要行为的 VisualStateGroup 时,请确保该组还包含第二个 VisualState,可以调用该 VisualState 来取消以前的状态。 这可以像声明第二个 VisualState 一样简单,根本没有 情节提要 ,只是一个 x:Name 属性。
为 VisualStateGroup 设置的 x:Name 属性值不用于调用 VisualStateManager.GoToState;而是用于 VisualStateManager.GoToState 的 VisualState 的 x:Name 属性。 使用 VisualStateManager.GoToState 的任何人都应了解所有可用的组和状态,以便每个调用都能从组内的旧状态正确转换为新状态。
除了一组 VisualState 元素外,VisualStateGroup 还可以定义一组 VisualTransition 元素,其中每个 VisualTransition 至少与组中定义的一个命名 VisualState 元素相关。 在 XAML 中, VisualState 元素集可以声明为 VisualStateGroup 的直接对象元素子元素。 这是可能的,因为 States 属性(视觉状态的集合)是 VisualStateGroup 的 XAML 内容属性。 相反,若要设置视觉转换的集合,必须在 XAML 中的 VisualStateGroup.Transitions 属性元素中声明该集合。 有关 XAML 内容属性的详细信息,请参阅 XAML 语法指南。
使用 StateTriggers 控制视觉状态时,触发器引擎使用以下优先规则对触发器进行评分,并确定哪个触发器和相应的 VisualState 将处于活动状态:
- 派生自 StateTriggerBase 的自定义触发器
- AdaptiveTrigger 因 MinWindowWidth 而激活
- AdaptiveTrigger 由于 MinWindowHeight 而激活
如果一次有多个活动触发器在评分 ((即) 两个活动的自定义触发器)发生冲突,则标记文件中声明的第一个触发器优先。
注意:尽管 AdaptiveTrigger 派生自 StateTriggerBase,但只能通过设置 MinWindowWidth 和/或 MinWindowHeight 来激活它。
VisualStateGroup 支持自定义 VisualStateManager 实现的 API
许多 VisualStateGroup API 的存在只是为了支持自定义 VisualStateManager 实现。 其中包括: Name、 CurrentState、 CurrentStateChanging、 CurrentStateChanged。 控件模板的视觉状态的最常见用法不需要这些 API。 具体而言,处理事件并不常见。 控件的大多数逻辑操作应涉及其自己的属性和事件。 对于大多数应用和控件定义方案,发生在控件上的视觉状态更改应只是控件应用于其模板的逻辑的最终结果,而不是其他逻辑的触发器。
构造函数
VisualStateGroup() |
初始化 VisualStateGroup 类的新实例。 |
属性
CurrentState |
从成功调用 GoToState 方法获取最近设置的 VisualState 。 |
Dispatcher |
获取与此 对象关联的 CoreDispatcher 。 CoreDispatcher 表示可以访问 UI 线程上的 DependencyObject 的工具,即使代码是由非 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 |
当控件开始更改为不同的状态时发生。 |