2013-12-19 49 views
6

所以這就是問題所在。我有下面的代碼變種在我的測試框架(假設appBarButton是ApplicationBarIconButton):如何以編程方式單擊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(); 
} 

兩件不工作。所以我想找到一些解決方法以編程方式單擊ApplicationBarIconButton。任何幫助?

+2

對不起,但我不明白以編程方式執行點擊的原因。你爲什麼不提高事件或通過點擊事件調用de方法? – rubenfa

+0

我想擴展現有的測試框架([link](https://github.com/Expensify/WindowsPhoneTestFramework))來自動化一些步驟。在某些情況下,這個框架似乎行爲不正確,AppBar參與其中。 –

+2

啊,好吧,我明白了。我不知道它是否可行,因爲AppBar由PhoneApplicationPage類公開,並由Phone Shell管理。 – rubenfa

回答

1

UI自動化,開發者的禍根。出於某種奇怪的原因,您無法自動化應用程序欄按鈕。但是,如果您可以修改應用程序的源代碼,則可以採用以下技巧。首先,創建一個新的類:現在

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

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

,在您的XAML取代shell:ApplicationBarIconButtonwp8App:CustomApplicationBarIconButton,你現在就可以自動完成這樣的按鈕。

不幸的是,您無法以編程方式替換這些按鈕,因爲您無法提取事件處理程序並將其切換。平臺禁止訪問任何私有方法/字段。

+1

謝謝你的回覆。我已經實現了我自己的類,使用命令而不是事件處理程序(僅用於MVVM兼容性),它就像一個魅力。 –

相關問題