在哪里可以找到列出控件中所有状态的属性

本文关键字:状态 属性 控件 在哪里 | 更新日期: 2023-09-27 18:22:11

我在看一个winrt项目的模板,它的后退按钮有以下样式:

<VisualStateManager.VisualStateGroups>
    <VisualStateGroup x:Name="CommonStates">
        <VisualState x:Name="Normal" />
        <VisualState x:Name="PointerOver">
            ...
        </VisualState>
        <VisualState x:Name="Pressed">
           ...
        </VisualState>
        <VisualState x:Name="Disabled">
            ...
        </VisualState>
    </VisualStateGroup>
    <VisualStateGroup x:Name="FocusStates">
        <VisualState x:Name="Focused">
            ...
        </VisualState>
        <VisualState x:Name="Unfocused" />
        <VisualState x:Name="PointerFocused" />
    </VisualStateGroup>
</VisualStateManager.VisualStateGroups>

我假设上面的VisualStates是按钮状态,但我不知道在按钮对象上跟踪它的位置,以及框架如何将状态绑定到视觉状态。

我一直在网上四处寻找,以更好地了解情况,但无济于事。请帮我理解这一切是如何联系在一起的。我知道您可以从代码后面手动转到特定的状态,但这里似乎缺少一个约定。

在哪里可以找到列出控件中所有状态的属性

没有属性列出控件状态。

根据MSDN,控件作者必须提供一个control contract,以便ControlTemplate作者知道在模板中放入什么。

控制权合同有三个要素:

  • 控件的逻辑使用的视觉元素
  • 控件的状态以及每个状态所属的组
  • 在视觉上影响控件的公共属性

视觉元素和状态都作为Class Attributes 提供

[TemplatePart(Name = "XXX", Type = typeof(RepeatButton))]
[TemplatePart(Name = "YYY", Type = typeof(RepeatButton))]
[TemplateVisualState(Name = "Focused", GroupName = "FocusedStates")]
[TemplateVisualState(Name = "Unfocused", GroupName = "FocusedStates")]

你应该检查一下默认的控件样式和模板,我想你要找的所有数据都会在那里。

如果你必须在运行时获得数据,那么你可以使用Reflection来获得给定的类属性,比如:

System.Reflection.MemberInfo info = typeof(MyClass);
object[] attributes = info.GetCustomAttributes(true);
for (int i = 0; i < attributes.Length; i++)
{
  if (attributes[i] is TemplatePart || attributes[i] is TemplateVisualState)
  {
     System.Console.WriteLine(((TemplateVisualState) attributes[i]).Name);
  }   
}

阅读MSDN的这篇文章,它会让事情变得更清楚。