Как преобразовать DependencyObject в AutomationElement?

Я просматриваю приложение WPF через его VisualTree, используя VisualTreeHelper, который возвращает Объекты зависимостей.

for(int i = 0; i < VisualTreeHelper.GetChildrenCount(rootObject); i++) {
    var child = VisualTreeHelper.GetChild(rootObject, i);
}

Однако, как только я найду объект, который ищу (в данном случае это кнопка), мне нужно «нажать»/вызвать его. Я успешно вызвал кнопку, используя InvokePattern в Элемент автоматизации.

private void ClickBtn(AutomationElement btnElement) {
    InvokePattern btnPattern = btnElement.GetCurrentPattern(
        InvokePattern.Pattern) as InvokePattern;
    btnPattern.Invoke();
}

Итак, проблема стоит: как мне преобразовать DependencyObjects в AutomationElement?
Или: Как вызвать DependancyObject?
Или: Как мне создать AutomationElement, который указывает на тот же элемент WPF, что и заданная доза DependencyObjects?

Edit1:
Я обнаружил, что могу преобразовать объект DependancyObject в элемент управления.

var childVisual = VisualTreeHelper.GetChild(rootObject, i);
var childInstance = childVisual as Control; 

Однако проблема остается: как мне вызвать элемент управления?
Или: Как преобразовать элемент управления в элемент автоматизации?


person Olian04    schedule 15.06.2017    source источник


Ответы (1)


Оказывается, я мог бы привести AutomationElement к ButtonBase и вызвать его метод «OnLoad» через отражение:

var childVisual = VisualTreeHelper.GetChild(rootObject, i);
var btnToInvoke = childVisual as ButtonBase; 
MethodInfo clickMethodInfo = typeof(Button).GetMethod("OnClick",
    BindingFlags.NonPublic | BindingFlags.Instance);
clickMethodInfo.Invoke(btnToInvoke, new object[] {});
person Olian04    schedule 16.06.2017