VisualStateManager
中的状态和VisualStateGroup
的名称是任意的,还是有更深的含义?
在某些方面,它们看起来与CSS中的伪类类似(Button
具有CommonStates
:Normal
、PointerOver
、Pressed
和Disabled
,而CSS有:hover
、:active
和定位禁用控件的方法)。但是它们也是不同的-Checkbox有(似乎)完全不同的状态,比如Checked
、Unchecked
和Indeterminate
。
当我开发我的应用程序时,我如何知道哪些VisualState是可用的?如果我使用了错误的名称会发生什么?Disclaimer: I work for Microsoft.
1条答案
按热度按时间83qze16e1#
州名是否有更深层次的含义?
VisualStateManager
中的状态和VisualStateGroup
的名称是任意的,还是有更深的含义?状态和
VisualStateGroup
s * 的名称确实是任意的,但它们 * 确实 * 有更深的含义。VisualStateManager中的VisualState s是
[representations of] the visual appearance of a UI element when it is in a specific state
。它们使用Storyboard s或Setter来表示对给定控件的任意更改(例如,使背景变为红色)。控件作者可以在其代码隐藏中调用VisualStateManager.GoToState来激活已命名的VisualState。这样,VisualState名称是任意的:我可以创建一个名为
CitelaosGreatState
的VisualState,并通过调用GoToState(this, "CitelaosGreatState")
来激活它。这就是为什么会有这么多的名称-Button具有您提到的CommonState,而Checkboxes具有完全不同的CommonState。但是,出于实用目的,您选择的VisualState名称不是任意的。
如果您要使用VisualStateManager修改预设控件的外观(借由覆写ControlTemplate),您几乎肯定要挑选与原始ControlTemplate中的名称完全Map的VisualState和VisualStateGroup名称(您可以在XAML设计工具或in generic.xaml中找到)。这是功能的问题:比如
Button
的实现者为当您悬停Button时出现的VisualState选择了一个任意的名称-CommonStates
x 1 m8n1x。他们代码背后处理悬停Button的逻辑调用GoToState(this, "PointerOver")
(或一些等效的)。如果您想定制该外观,您必须提供具有该名称的VisualState。当然,您也可以 * 提供一个名为
CitelaosGreatState
或甚至Hover
的很酷的状态,但是如果代码隐藏从未使用相同的字符串调用GoToState
,则无论名称如何,您的状态都将永远不会被激活。当然,这意味着对于完全自定义的控件(您可以控制
VisualStateManager
* 和对VisualStateManager.GoToState
的 * 调用),您可以随意命名状态!如何知道要选择哪些名称?
当我开发应用程序时,我如何知道哪些VisualState可用?
*完全自定义控件:如上所述,如果您同时编写
VisualStateManager
和对VisualStateManager.GoToState
的调用,则可以随意命名VisualStates!如果您定义了一个名为State1
的状态,则可以使用GoToStateState1
在代码隐藏中激活它。*现有控件的自定义模板:如果您要重新样板化现有的控件(使用
ControlTemplate
),您应该选择符合该控件上现有状态的名称。例如,Button定义CommonStates
:Hovered
、PointerOver
、Pressed
和Disabled
。定义它们。具有其他名称的状态将永远不会被激活(因为XAML团队编写的代码隐藏永远不会使用该名称GoToState)。要了解现有状态-如何知道控件的现有VisualState?
1.查询控件的预设ControlTemplate(或
Style
搭配所需型别的TargetType
)(如前所述,您可以在XAML设计工具或in generic.xaml中找到)。1.使用模板的
VisualStateGroup
中的名称。名字不对?
如果我用错了名字会怎么样?
由于名字是任意的,“名字不对”并不是这里最清楚的问题,看两种情况会更容易:
GoToState
激活的VisualState(例如,您向Button的自定义模板中添加了一个名为CitelaosGreatState
或Hover
的状态):没有什么可怕的事情发生,但你的状态将永远不会被激活。GoToState
调用没有任何作用。