如何将DependencyObject转换为AutomationElement?

时间:2017-06-15 14:05:19

标签: c# wpf type-conversion visual-tree visualtreehelper

我正在使用VisualTreeHelper通过其VisualTree遍历WPF应用程序,该DependencyObjects正在返回InvokePattern

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

然而,一旦我找到了我正在寻找的对象(在这种情况下是一个按钮),我需要按下&#34; /调用它。我已使用AutomationElement上的enter image description here成功调用了一个按钮。

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

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

编辑1:
我发现我可以将DependancyObject转换为Control。

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

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

1 个答案:

答案 0 :(得分: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[] {});