2017-06-15 5 views
0

Ich durchquere eine WPF-Anwendung über ihren VisualTree, unter Verwendung der VisualTreeHelper, die DependencyObjects zurückgibt.Wie konvertiert man ein DependencyObject in ein AutomationElement?

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

jedoch sobald ich das Objekt finden ich suche (in diesem Fall seine eine Schaltfläche) Ich muss „Presse“/es aufzurufen. Ich habe erfolgreich eine Schaltfläche mit einem InvokePattern auf einem AutomationElement aufgerufen.

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

So steht das Problem: Wie konvertiere ich ein DependencyObjects in ein AutomationElement?
Oder: Wie rufe ich ein DependancyObject auf?
Oder: Wie erstelle ich ein AutomationElement, das auf das gleiche WPF-Element wie eine bestimmte DependencyObjects-Dosis verweist?

Edit1:
Ich habe festgestellt, dass ich die DependancyObject auf eine Steuer umwandeln kann.

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

Allerdings steht das Problem: Wie rufe ich ein Steuerelement?
Oder: Wie konvertiere ich ein Control in ein AutomationElement?

Antwort

0

Es stellte sich heraus ich die Automation zu einem Button werfen konnte und seine „OnLoad“ Methode durch Reflexion nennen:

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[] {}); 
Verwandte Themen