首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在WinRT中注册和注销具有反射的事件

在WinRT中注册和注销具有反射的事件
EN

Stack Overflow用户
提问于 2014-04-22 07:21:31
回答 2查看 383关注 0票数 0

对于我的开源项目http://mytoolkit.codeplex.com,我试图为WinRT和WinPRT (8.1)实现一个改进的页面类。该类位于PCL库中。这就是为什么我必须通过反射注册回按事件。没有反射的代码如下所示:

代码语言:javascript
复制
using Windows.Phone.UI.Input;

namespace SampleUniversalPhoneApp
{
    public class MyClass
    {
        public void Start()
        {
            HardwareButtons.BackPressed += OnBackPressed;
        }

    public void Stop()
    {
        HardwareButtons.BackPressed -= OnBackPressed;
    }

    private void OnBackPressed(object sender, BackPressedEventArgs e)
    {
        // TODO: Add more code
        e.Handled = true;
    }
}

}

现在,我需要完全相同的逻辑,但需要反射,因为HardwareButtonsBackPressedEventArgs类在我的PCL库中不可用。

我怎么能这么做?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-22 17:10:36

以下是这个问题的解决方案:

代码语言:javascript
复制
public class MyClass
{
    private object _backPressedToken;
    private static readonly Type _hardwareButtonsType;
    private static readonly EventInfo _backPressedEvent;

    static MyClass()
    {
        _hardwareButtonsType = Type.GetType(
            "Windows.Phone.UI.Input.HardwareButtons, " +
            "Windows, Version=255.255.255.255, Culture=neutral, " +
            "PublicKeyToken=null, ContentType=WindowsRuntime");

        if (_hardwareButtonsType != null)
            _backPressedEvent = _hardwareButtonsType.GetRuntimeEvent("BackPressed");
    }

    public void Start()
    {
        // Register event
        Action<object, object> callback = OnBackKeyPressed;
        var callbackMethodInfo = callback.GetMethodInfo();
        var backPressedDelegate = callbackMethodInfo.CreateDelegate(_backPressedEvent.EventHandlerType, this);
        _backPressedToken = _backPressedEvent.AddMethod.Invoke(null, new object[] { backPressedDelegate });
    }

    public void Stop()
    {
        // Unregister event
        _backPressedEvent.RemoveMethod.Invoke(null, new [] { _backPressedToken });
        _backPressedToken = null; 
    }

    private void OnBackKeyPressed(object sender, dynamic args)
    {
        // Handle event
        if (!args.Handled)
            args.Handled = DoIt(args.Handled);
    }
}

最后在这个类中使用:

https://github.com/MyToolkit/MyToolkit/blob/master/src/MyToolkit.Extended/Paging/Handlers/BackKeyPressedHandler.cs

票数 2
EN

Stack Overflow用户

发布于 2014-04-22 08:48:52

PCL库用于手机、平板电脑或计算机应用程序,这就是为什么您找不到任何特定于UI的类。

因此,这将是您库的客户端管理这些UI特定机制的工作。

我不认为使用反射是个好主意;如果你开始使用它,你最终会得到一个充满反射代码的库,很难维护,很难理解。

IMHO,您应该改变您的架构,给库的客户端提供更多的权力。

顺便提一句,微软将很快发布一个新的VS2013更新(已经作为测试版提供),允许您为所有基于微软的设备开发一个独特的应用程序。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23213097

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档