我正在查看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是按钮状态,但我无法弄清楚按钮对象上的跟踪位置以及框架如何将状态绑定到视觉状态。
我一直在互联网上寻找更好的理解,但无济于事。请帮助我理解这一切是如何捆绑在一起的。我知道你可以从后面的代码手动转到特定的状态,但似乎这里有一个我缺少的约定。
答案 0 :(得分:2)
没有属性列出了控件状态。
根据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")]
你应该超越默认Control Styles and Templates我认为你要找的所有数据都会在那里。
如果您必须在运行时获取数据,那么您可以使用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 Article它会让事情变得更清晰