Как преобразовать объект DependencyObject в элемент AutomationElement?

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

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

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

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; 

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

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[] {});
Другие вопросы по тегам