2013-12-19 4 views
6

Das ist also die Frage. Ich habe die folgenden Varianten von Code in meinem Test-Framework (vorausgesetzt appBarButton ist ApplicationBarIconButton):Wie programmgesteuert auf ein ApplicationBarIconButton klicken?

var bindingFlags = BindingFlags.Instance | BindingFlags.NonPublic; 
var method = typeof(ApplicationBarIconButton) 
      .GetMethod("ClickEvent", bindingFlags); 

if (method != null) 
{ 
    method.Invoke(appBarButton, null); 
} 

oder

IInvokeProvider invokableButton; 
var isInvokable = (invokableButton = appBarButton as IInvokeProvider) != null; 
if (isInvokable) 
{ 
    invokableButton.Invoke(); 
} 

Beide Stücke sind nicht funktioniert. Daher möchte ich einige Problemumgehungen finden, um programmgesteuert auf ApplicationBarIconButton zu klicken. Irgendeine Hilfe?

+2

Sorry, aber ich verstehe den Grund für einen Klick programmgesteuert nicht. Warum heben Sie nicht die Ereignis- oder Call-de-Methode auf, die vom Click-Event aufgerufen wird? – rubenfa

+0

Ich möchte das bestehende Test-Framework ([link] (https://github.com/Expensefy/WindowsPhoneTestFramework)) erweitern, um einige Schritte zu automatisieren. Dieses Framework scheint sich in einigen Fällen falsch zu verhalten, in denen AppBar beteiligt ist. –

+2

Ah, ok ich habe verstanden. Ich weiß nicht, ob das möglich ist, weil AppBar durch die PhoneApplicationPage-Klasse verfügbar gemacht und von der Phone Shell verwaltet wird. – rubenfa

Antwort

1

UI-Automatisierung, der Fluch der Entwickler. Aus irgendeinem seltsamen Grund können Sie Schaltflächen der Anwendungsleiste nicht automatisieren. Wenn Sie jedoch den Quellcode der Anwendung ändern können, können Sie den folgenden Trick anwenden. Erstellen Sie zunächst eine neue Klasse:

public class CustomApplicationBarIconButton : ApplicationBarIconButton 
{ 
    public new event EventHandler Click; 

    public void RaiseClick() 
    { 
     if (Click != null) 
      Click(this, EventArgs.Empty); 
    } 
} 

nun in XAML shell:ApplicationBarIconButton mit wp8App:CustomApplicationBarIconButton ersetzen und Sie können nun solche Tasten automatisieren.

Leider können Sie solche Schaltflächen nicht programmgesteuert ersetzen, da Sie Ereignishandler nicht extrahieren und sie wechseln können. Und der Zugriff auf private Methoden/Felder ist durch die Plattform verboten.

+1

Vielen Dank für Ihre Antwort. Ich habe bereits eine eigene Klasse implementiert, die Befehle anstelle von Event-Handlern verwendet (nur für MVVM-Kompatibilität) und es funktioniert wie ein Zauber. –