Xaml VisualStateManager中的状态名称有意义吗?

Xaml VisualStateManager中的状态名称有意义吗?,xaml,uwp,windows-runtime,Xaml,Uwp,Windows Runtime,VisualStateManager中的状态和VisualStateGroups的名称是任意的,还是有更深的含义 在某些方面,它们似乎类似于CSS中的伪类(按钮有公共状态:正常,指针,按下,和禁用,而CSS有:悬停,:活动,以及锁定禁用控件的方法)。但它们也是不同的复选框(看起来),如选中的,未选中的,和不确定的 在开发应用程序时,我如何知道哪些可视状态可用?如果我用错了名字会怎么样?各州的名字有更深的含义吗? VisualStateManager中的状态和VisualStateGroups的名

VisualStateManager
中的状态和
VisualStateGroup
s的名称是任意的,还是有更深的含义

在某些方面,它们似乎类似于CSS中的伪类(
按钮
公共状态
正常
指针
按下
,和
禁用
,而CSS有
:悬停
:活动
,以及锁定禁用控件的方法)。但它们也是不同的复选框(看起来),如
选中的
未选中的
,和
不确定的

在开发应用程序时,我如何知道哪些可视状态可用?如果我用错了名字会怎么样?

各州的名字有更深的含义吗?
VisualStateManager
中的状态和
VisualStateGroup
s的名称是任意的,还是有更深的含义

州和
VisualStateGroup
s的名称确实是任意的,但它们有更深的含义

中的是UI元素处于特定状态时的视觉外观。它们使用s或setter来表示对给定控件的任意更改(例如,使背景为红色)。控件作者可以在其代码隐藏中调用以激活命名的VisualState

通过这种方式,VisualState名称是任意的:我可以创建一个名为
CitelaosGreatState
的VisualState,并通过调用
GoToState(这是“CitelaosGreatState”)
来激活它。这就是为什么有这么多的名称按钮有你提到的CommonState,而复选框有完全不同的名称

但是,出于实际目的,您选择的VisualState名称不是任意的

如果您使用VisualStateManager,您几乎肯定希望选择与原始ControlTemplate中的名称完全对应的VisualState和VisualStateGroup名称(您可以在XAML设计器或中找到)。这是一个功能问题:例如,
按钮
的实现者为VisualState选择了一个任意名称,当您将按钮悬停在CommonStates上时,VisualState就会出现。他们的codebehind中处理悬停按钮的逻辑调用
GoToState(这是“指针悬停”)
(或一些等效的)。如果要自定义该外观,必须提供具有该名称的VisualState

当然,您也可以提供一个名为
CitelaosGreatState
,甚至是
Hover
,很酷的状态,但是如果codebehind从不使用相同的字符串调用
GoToState
,则无论名称如何,您的状态都将永远不会被激活

当然,这意味着对于完全自定义的控件(您可以控制
VisualStateManager
和对
VisualStateManager.GoToState
的调用),您可以随意命名您的状态

我如何知道要选择哪些名称? 在开发应用程序时,我如何知道哪些可视状态可用

  • 完全自定义控件:如上所述,如果您同时编写
    VisualStateManager
    和对
    VisualStateManager.GoToState的调用,请随意命名VisualState!如果您定义了一个名为
    State1
    的状态,则可以使用GoToState
    State1
    在codebehind中激活它
  • 现有控件的自定义模板:如果要重新模板现有控件(使用
    ControlTemplate
    ),则应选择与该控件上现有状态匹配的名称。例如,按钮定义
    公共状态
    悬停
    指针悬停
    按下
    ,以及
    禁用
    。定义这些。具有其他名称的状态将永远不会被激活(因为XAML团队编写的代码隐藏永远不会使用该名称启动)。了解现状-
如何知道控件的现有可视状态?
  • 为您的控件(如前所述,您可以在XAML设计器或中找到)查找默认控件模板(或带有所需类型的
    TargetType
  • 使用模板的
    VisualStateGroup
    中的名称
  • 名字错了? 如果我用错名字会怎么样

    由于名称是任意的,“错误的名称”不是这里最清楚的问题。我们更容易看到两种情况:

    • 您定义了一个codebehind永远不会使用
      GoToState
      激活的VisualState(例如,您为按钮的自定义模板添加了一个名为
      CitelaosGreatState
      Hover
      的状态):没有什么可怕的事情发生,但您的状态永远不会被激活
    • 您无法定义codebehind尝试激活的VisualState(例如,您为自定义按钮模板添加了不完整的VisualStateGroup):
      gostate
      调用无效