我正在使用VisualTreeHelper通过其VisualTree遍历WPF应用程序,该DependencyObjects正在返回InvokePattern。
for(int i = 0; i < VisualTreeHelper.GetChildrenCount(rootObject); i++) {
var child = VisualTreeHelper.GetChild(rootObject, i);
}
然而,一旦我找到了我正在寻找的对象(在这种情况下是一个按钮),我需要按下&#34; /调用它。我已使用AutomationElement上的成功调用了一个按钮。
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?
答案 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[] {});