Должен ли я использовать AutomationPeer или AutomationElement? Или оба?

Я только начал использовать AutomationElement, потому что мы хотим провести интеграционное тестирование наших пользовательских элементов управления, и я думаю, что мне следует использовать AutomationElement.

Я успешно создал окно с пользовательским элементом управления и могу успешно получить элементы автоматизации как для окна, так и для элемента управления.

  // Retrieve the View
  System.Windows.Automation.Condition viewCondition = new PropertyCondition(AutomationElement.AutomationIdProperty, "MyTestView");
  AutomationElement view = AutomationElement.RootElement.FindFirst(TreeScope.Children, viewCondition);
  Assert.IsNotNull(view);

  // Retrieve the CustomControl
  System.Windows.Automation.Condition comboboxCondition = new PropertyCondition(AutomationElement.AutomationIdProperty, "MyCustomControl");
  AutomationElement combobox = view.FindFirst(TreeScope.Children, comboboxCondition);
  Assert.IsNotNull(comboboxCondition);

Теперь я хочу использовать, например, ValuePattern. И тут я путаюсь.

В поисках информации я искал исходный код WPF по адресу referencesource.microsoft.com. Я столкнулся с ComboboxAutomationPeer, который реализует IValueProvider, так что теперь я запутался.

Должен ли я также реализовать MyCustomControlAutomationPeer, который реализует IValueProvider, и будет ли тогда AutomationElement работать с ValuePattern? Или мне нужно, чтобы MyCustomControl реализовал IValueProvider?


person Diana    schedule 26.06.2015    source источник
comment
В приложении, которое вы пытаетесь автоматизировать, существует AutomationPeer. Как этот для ComboBox в приложении WPF. Элемент AutomationElement используется в коде, который использует автоматизацию для работы с таким приложением WPF. Этот код.   -  person Hans Passant    schedule 26.06.2015
comment
Спасибо за объяснение различия Ганс.   -  person Diana    schedule 27.06.2015


Ответы (1)


Вам не нужно ничего реализовывать, чтобы использовать шаблон. Автоматизация пользовательского интерфейса делает это за вас (действуя как прокси для целевого приложения). Это хорошо объяснено в официальной документации здесь: Поддерживаемые шаблоны управления автоматизацией пользовательского интерфейса

Вот пример извлечения:

    SelectionItemPattern pattern;
    try
    {
        pattern = yourAutomationElement.GetCurrentPattern(SelectionItemPattern.Pattern) as SelectionItemPattern;
    }
    catch (InvalidOperationException ex)
    {
        Console.WriteLine(ex.Message);  // Most likely "Pattern not supported." 
        return;
    }
    pattern.Select();
person Simon Mourier    schedule 26.06.2015
comment
Хорошо, теперь я буду более конкретным: предположим, у меня есть настраиваемый элемент управления, состоящий из частей шаблона. Вы говорите, что этот пользовательский элемент управления автоматически будет иметь шаблоны своих частей? т.е. Мне не нужно ничего реализовывать в своем пользовательском элементе управления для автоматизации пользовательского интерфейса, потому что он наследует шаблоны, скажем, части текстового поля? - person Diana; 27.06.2015
comment
Итак, теперь вы говорите о серверной части, где используются AutomationPeers (мой пример — клиентская сторона). На стороне сервера, в общем, вам не нужно ничего делать, так как WPF автоматически создает одноранговые элементы для стандартных элементов управления. Однако, если вам нужно добавить какое-то пользовательское поведение (например, если у вас есть чистый рисунок, но вы хотите выделить некоторые части), вы можете это сделать. Но вы должны сначала проверить, что ваши элементы управления выставляют из коробки, используя инструменты UIA sdk (inspect.exe и т. д.). - person Simon Mourier; 27.06.2015
comment
У меня нет стандартного управления. У меня есть настраиваемый элемент управления с частями шаблона. Наследует ли мой пользовательский элемент управления шаблоны частей шаблона? - person Diana; 27.06.2015
comment
да. Но, как я уже сказал, просто попробуйте и используйте Inspect из SDK, вы увидите, видно ли это и как, какие шаблоны поддерживаются и т. д. - person Simon Mourier; 27.06.2015
comment
Большое спасибо за ваши терпеливые ответы, я вернулся на работу в понедельник и продолжу свои эксперименты с AutomationElement и ValuePattern. (Тогда приму ваш ответ) - person Diana; 27.06.2015
comment
Не удосужился поэкспериментировать с этим дальше, извините. В последнее время это не достигло вершины нашего плана спринта. Я вернусь к этому, как только смогу. - person Diana; 13.07.2015