0

我正在使用返回DependencyObjects的VisualTreeHelper通过其 VisualTree 遍历 WPF 应用程序。

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

但是,一旦我找到我正在寻找的对象(在这种情况下它是一个按钮),我需要“按下”/调用它。我已经在AutomationElement上使用InvokePattern成功调用了一个按钮。

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

所以问题是:如何将 DependencyObjects 转换为 AutomationElement?
或者:我如何调用 DependancyObject?
或者:我如何创建一个指向与给定 DependencyObjects 剂量相同的 WPF 元素的 AutomationElement?

Edit1:
我发现我可以将 DependancyObject 转换为控件。

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

但是问题是:我如何调用控件?
或者:如何将控件转换为 AutomationElement?

4

1 回答 1

0

原来我可以将 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[] {});
于 2017-06-16T13:35:44.910 回答