2013-12-19 5 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

Извините, но я не понимаю причину для программного программирования. Почему вы не поднимаете событие или не вызываете метод, вызванный событием click? – rubenfa

+0

Я хочу расширить существующую тестовую среду ([link] (https://github.com/Expensify/WindowsPhoneTestFramework)), чтобы автоматизировать некоторые этапы. В некоторых случаях эта структура работает некорректно, в которой участвует AppBar. –

+2

А, ладно, я понял. Я не знаю, возможно ли это, потому что AppBar отображается классом PhoneApplicationPage и управляется Phone Shell. – rubenfa

ответ

1

Автоматизация пользовательского интерфейса, проклятие разработчиков. По какой-то странной причине вы не можете автоматизировать кнопки панели приложений. Но, если вы можете изменить исходный код приложения, вы можете использовать следующий трюк. Во-первых, создать новый класс:

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

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

Теперь в вашем XAML заменить shell:ApplicationBarIconButton с wp8App:CustomApplicationBarIconButton и теперь вы можете автоматизировать такие кнопки.

К сожалению, вы не можете программно заменить такие кнопки, так как вы не можете извлекать обработчики событий и переключать их. И доступ к любым частным методам/полям запрещен платформой.

+1

Благодарим вас за ответ. Я уже реализовал для себя свой собственный класс, используя команды вместо обработчиков событий (только для совместимости с MVVM), и он работает как шарм. –

Смежные вопросы