Как преобразовать объект 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[] {});