XAML VisualStateManager中的状态名称是否有意义?

h79rfbju  于 2022-12-07  发布在  其他
关注(0)|答案(1)|浏览(136)

VisualStateManager中的状态和VisualStateGroup的名称是任意的,还是有更深的含义?
在某些方面,它们看起来与CSS中的伪类类似(Button具有CommonStatesNormalPointerOverPressedDisabled,而CSS有:hover:active和定位禁用控件的方法)。但是它们也是不同的-Checkbox有(似乎)完全不同的状态,比如CheckedUncheckedIndeterminate
当我开发我的应用程序时,我如何知道哪些VisualState是可用的?如果我使用了错误的名称会发生什么?
Disclaimer: I work for Microsoft.

83qze16e

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选择了一个任意的名称-CommonStatesx 1 m8n1x。他们代码背后处理悬停Button的逻辑调用GoToState(this, "PointerOver")(或一些等效的)。如果您想定制该外观,您必须提供具有该名称的VisualState。
当然,您也可以 * 提供一个名为CitelaosGreatState或甚至Hover的很酷的状态,但是如果代码隐藏从未使用相同的字符串调用GoToState,则无论名称如何,您的状态都将永远不会被激活。
当然,这意味着对于完全自定义的控件(您可以控制VisualStateManager * 和对VisualStateManager.GoToState的 * 调用),您可以随意命名状态!

如何知道要选择哪些名称?

当我开发应用程序时,我如何知道哪些VisualState可用?

*完全自定义控件:如上所述,如果您同时编写VisualStateManager和对VisualStateManager.GoToState的调用,则可以随意命名VisualStates!如果您定义了一个名为State1的状态,则可以使用GoToState State1在代码隐藏中激活它。
*现有控件的自定义模板:如果您要重新样板化现有的控件(使用ControlTemplate),您应该选择符合该控件上现有状态的名称。例如,Button定义CommonStatesHoveredPointerOverPressedDisabled。定义它们。具有其他名称的状态将永远不会被激活(因为XAML团队编写的代码隐藏永远不会使用该名称GoToState)。要了解现有状态-

如何知道控件的现有VisualState?

1.查询控件的预设ControlTemplate(或Style搭配所需型别的TargetType)(如前所述,您可以在XAML设计工具或in generic.xaml中找到)。
1.使用模板的VisualStateGroup中的名称。

名字不对?

如果我用错了名字会怎么样?
由于名字是任意的,“名字不对”并不是这里最清楚的问题,看两种情况会更容易:

  • 您定义了一个代码隐藏永远不会使用GoToState激活的VisualState(例如,您向Button的自定义模板中添加了一个名为CitelaosGreatStateHover的状态):没有什么可怕的事情发生,但你的状态将永远不会被激活。
  • 未能定义代码隐藏尝试激活得VisualState(例如,为自定义Button模板添加了不完整得VisualStateGroup):GoToState调用没有任何作用。

相关问题