【问题标题】:How to programmatically click an ApplicationBarIconButton?如何以编程方式单击 ApplicationBarIconButton?
【发布时间】:2014-01-08 04:45:42
【问题描述】:

这就是问题所在。我的测试框架中有以下代码变体(假设 appBarButton 是 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。有什么帮助吗?

【问题讨论】:

  • 抱歉,我不明白以编程方式执行点击的原因。为什么不升事件或者调用点击事件调用的de方法呢?
  • 我想扩展现有的测试框架(link)来自动化一些步骤。在涉及 AppBar 的某些情况下,该框架似乎表现不正确。
  • 啊,好的,我明白了。不知道有没有可能,因为 AppBar 是由 PhoneApplicationPage 类公开,由 Phone Shell 管理的。
  • 你不能这样做,因为 Click 是一个事件处理程序并且只暴露了添加/删除。您可以创建一个 ApplicationBarManager 来处理按钮的创建并保留已注册处理程序的日志,但这对我来说似乎是错误的!

标签: c# windows-phone-8 windows-phone appbar


【解决方案1】:

UI 自动化是开发人员的祸根。出于某种奇怪的原因,您无法自动化应用程序栏按钮。但是,如果您可以修改应用程序的源代码,则可以使用以下技巧。首先,创建一个新类:

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

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

现在,在您的 XAML 中将 shell:ApplicationBarIconButton 替换为 wp8App:CustomApplicationBarIconButton,您现在可以自动执行此类按钮。

不幸的是,您无法以编程方式替换此类按钮,因为您无法提取事件处理程序并切换它们。并且平台禁止访问任何私有方法/字段。

【讨论】:

  • 感谢您的回复。我已经为它实现了我自己的类,使用命令而不是事件处理程序(只是为了 MVVM 兼容性),它就像一个魅力。
猜你喜欢
  • 1970-01-01
  • 2015-02-09
  • 1970-01-01
  • 2021-09-30
  • 1970-01-01
  • 1970-01-01
  • 2013-10-09
  • 2011-10-22
  • 2015-03-17
相关资源
最近更新 更多