【问题标题】:Do the names of states in a VisualStateManager have meaning?VisualStateManager 中的状态名称是否有意义?
【发布时间】:2021-04-10 13:51:12
【问题描述】:

VisualStateManager 中的状态和VisualStateGroups 的名称是任意的,还是有更深层次的含义?

在某些方面,它们看起来类似于 CSS 中的伪类(ButtonCommonStatesNormalPointerOverPressedDisabled,而 CSS 有 :hover、@ 987654331@,以及针对禁用控件的方法)。但它们也不同——复选框有(似乎)completely different statesCheckedUncheckedIndeterminate

在开发应用程序时,我如何知道哪些 VisualStates 可用?如果我使用错误的名称会怎样?

【问题讨论】:

    标签: xaml uwp windows-runtime


    【解决方案1】:

    州名是否有更深的含义?

    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 定义了CommonStatesHoveredPointerOverPressedDisabled。定义那些。永远不会激活具有其他名称的状态(因为 XAML 团队编写的代码隐藏从未使用该名称的 GoToState)。要了解现有状态——

    我如何知道控件的现有 VisualStates?

    1. 查找控件的默认 ControlTemplate(或 Style 和所需类型的 TargetType)(如前所述,您可以在 XAML 设计器或 in generic.xaml 中找到它)。
    2. 使用模板VisualStateGroup 中的名称。

    名字有误?

    如果我使用了错误的名称会怎样?

    由于名称是任意的,因此“错误名称”不是这里最清楚的问题。看两种情况比较容易:

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

    【讨论】:

      猜你喜欢
      • 2011-04-19
      • 2015-10-05
      • 2019-10-23
      • 2021-12-03
      • 2016-11-24
      • 1970-01-01
      • 1970-01-01
      • 2022-01-25
      • 1970-01-01
      相关资源
      最近更新 更多