2

我正在查看一个 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 是按钮状态,但我无法弄清楚在按钮对象上跟踪的位置以及框架如何将状态绑定到可视状态。

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

4

1 回答 1

3

没有列出控件状态属性。

根据 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 文章,它会让事情变得更清楚

于 2013-07-14T09:10:03.910 回答