Где я могу найти свойство, которое перечисляет все состояния в элементе управления?

Я искал шаблон для проекта 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, она прояснит ситуацию

Другие вопросы по тегам