Где я могу найти свойство, которое перечисляет все состояния в элементе управления?
Я искал шаблон для проекта 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 являются состояниями кнопок, но я не могу понять, где это отслеживается на объекте кнопки и как инфраструктура связывает состояние с визуальным состоянием.
Я искал все вокруг Интернета, чтобы получить лучшее понимание, но безрезультатно. Пожалуйста, помогите мне понять, как все это связано друг с другом. Я знаю, что вы можете вручную перейти к определенному состоянию из кода, но, похоже, здесь есть соглашение, которое я пропускаю.
1 ответ
Нет свойства, которое перечисляет элементы управления состояниями.
В соответствии с MSDN Control Авторы должны предоставить 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, она прояснит ситуацию