2013-12-19 5 views
6

それは問題です。どちらの作品が動作していないApplicationBarIconButtonをプログラムでクリックする方法

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

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

または

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

:私は私のテストフレームワーク(appBarButtonがApplicationBarIconButtonであると仮定して)内のコードの次のバリアントを持っています。ですから、私はApplicationBarIconButtonをプログラムでクリックするためのいくつかの回避策を探したいと思います。どんな助け?

+2

申し訳ありませんが、私はプログラムでクリックを実行する理由を理解していません。なぜあなたはイベントを起こしたり、クリックイベントによって呼び出されたメソッドを呼び出さないのですか? – rubenfa

+0

いくつかの手順を自動化するために、既存のテストフレームワーク([link](https://github.com/Expensify/WindowsPhoneTestFramework))を拡張したいと思います。このフレームワークは、AppBarが関与している場合には正しく動作しないようです。 –

+2

ああ、わかりました。 AppBarがPhoneApplicationPageクラスによって公開され、Phone Shellによって管理されるため、可能かどうかわかりません。 – rubenfa

答えて

1

UIオートメーション、開発者の悩み。奇妙な理由から、アプリケーションバーボタンを自動化することはできません。しかし、アプリケーションのソースコードを変更することができれば、次のようなトリックを採用することができます。あなたのXAMLでwp8App:CustomApplicationBarIconButtonshell:ApplicationBarIconButtonを交換し、あなたは今、このようなボタンを自動化することができ、今

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

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

:まず、新しいクラスを作成します。

イベントハンドラを抽出して切り替えることはできないため、残念ながら、このようなボタンをプログラムで置き換えることはできません。プライベートメソッド/フィールドへのアクセスは、プラットフォームによって禁止されています。

+1

返信いただきありがとうございます。イベントハンドラの代わりに(MVVM互換性のためだけに)コマンドを使用して独自のクラスを実装しましたが、それは魅力的です。 –

関連する問題