州名是否有更深的含义?
VisualStateManager 中的状态和VisualStateGroups 的名称是任意的,还是有更深层次的含义?
状态和VisualStateGroups 的名称确实是任意的,但它们确实有更深层次的含义。
VisualStateManager 中的VisualStates 是[representations of] the visual appearance of a UI element when it is in a specific state。他们使用Storyboards 或 Setter 来表示对给定 Control 的任意更改(例如,使背景变为红色)。控件作者可以在其代码隐藏中调用VisualStateManager.GoToState 来激活命名的 VisualState。
这样,VisualState 名称是任意的:我可以创建一个名为 CitelaosGreatState 的 VisualState 并通过调用 GoToState(this, "CitelaosGreatState") 来激活它。这就是为什么会有这么多种名称的原因——按钮有你提到的 CommonStates,而 Checkboxes 有完全不同的名字。
但是,出于实际目的,您选择的 VisualState 名称不是任意的。
如果您对modify the look & feel of a default control (by overriding the ControlTemplate) 使用 VisualStateManager,您几乎肯定希望选择与原始 ControlTemplate 中的名称完全对应的 VisualState 和 VisualStateGroup 名称(您可以在 XAML 设计器中找到或in generic.xaml)。这是一个功能问题:例如,Button 的实现者为悬停按钮时出现的 VisualState 选择了一个任意名称——CommonStatesPointerOver。他们代码隐藏中处理悬停按钮的逻辑调用GoToState(this, "PointerOver")(或类似的)。如果要自定义该外观,则必须提供具有该名称的 VisualState。
您当然可以也提供一个名为CitelaosGreatState 甚至Hover 的酷状态,但如果代码隐藏从不使用相同的字符串调用GoToState,您的状态将永远不会被激活,不管名字。
当然,这意味着对于完全自定义的控件(您可以同时控制VisualStateManager 和 对VisualStateManager.GoToState 的调用),您可以随意命名您的状态!
我如何知道该选择哪些名称?
在开发应用程序时,我如何知道哪些 VisualStates 可用?
-
完全自定义的控件:如上所述,如果您同时编写
VisualStateManager 和对 VisualStateManager.GoToState 的调用,请随意命名 VisualStates!如果您定义了一个名为 State1 的状态,您可以使用 GoToState State1 在代码隐藏中激活它。
-
现有控件的自定义模板:如果您要重新模板化现有控件(使用
ControlTemplate),您应该选择与该控件上现有状态匹配的名称。例如,Button 定义了CommonStates:Hovered、PointerOver、Pressed 和Disabled。定义那些。永远不会激活具有其他名称的状态(因为 XAML 团队编写的代码隐藏从未使用该名称的 GoToState)。要了解现有状态——
我如何知道控件的现有 VisualStates?
- 查找控件的默认 ControlTemplate(或
Style 和所需类型的 TargetType)(如前所述,您可以在 XAML 设计器或 in generic.xaml 中找到它)。
- 使用模板
VisualStateGroup 中的名称。
名字有误?
如果我使用了错误的名称会怎样?
由于名称是任意的,因此“错误名称”不是这里最清楚的问题。看两种情况比较容易:
- 您定义了一个VisualState,代码隐藏永远不会使用
GoToState 激活(例如,您在自定义模板中添加了一个名为CitelaosGreatState 或Hover 的状态按钮):不会发生任何可怕的事情,但您的状态将永远不会被激活。
- 您未能定义代码隐藏尝试激活的 VisualState(例如,您为自定义 Button 模板添加了不完整的 VisualStateGroup):
GoToState 调用无效。