【问题标题】:WinRT event not returning EventRegistrationTokenWinRT 事件未返回 EventRegistrationToken
【发布时间】:2015-08-10 13:10:33
【问题描述】:

我希望有人可以帮助我解决这个问题...或者可以澄清我做错了什么...

我正在向事件动态添加事件处理程序。
这对于 XAML 附带的控件非常有效,但不适用于我自己的事件。我发现在 WinRT 事件中返回一个 EventRegistrationToken。根据这个link "add" 应该返回一个令牌。
我的问题是我实现的所有事件都只返回 void。
我已经创建了多个项目(Win 8 WinRT、Win 8.1 Universal、Win 10 Universal)来找出我做错了什么。每个项目都显示出同样的问题。
我用谷歌搜索了几个小时......我发现的每个实现都声明“添加”需要一个返回对象。

我的问题是:

  1. 有人知道这是否是错误吗?
  2. 如果不是错误...是否需要设置或更改某些内容才能让我的事件返回令牌?
  3. 如果事件在您的环境中表现得像应有的那样,能否请您提供一个测试项目,以便我进行比较。也许这与项目设置或类型有关。

编辑:终于可以添加图片了...

PS:我还在 pastebin (code of DynamicEventHandler) 上发布了我的动态事件处理代码

【问题讨论】:

    标签: c# dynamic windows-runtime event-handling windows-store-apps


    【解决方案1】:

    在您的代码中,

    var method = this.GetType().GetRuntimeMethods().First(x => x.Name == "ExecuteCommand")

    ExecuteCommand 是 .NET 方法而不是 Windows 运行时方法,为什么要使用“GetRuntimeMethods”?

    这是我这边的代码。

    public MainPage()
    {
        this.InitializeComponent();
    
        var runtimeEvent = this.myButton.GetType().GetRuntimeEvent("Click");
        var handlerMethodInfo = this.GetType().GetMethod("OnClick");
    
        var delegateHandler = handlerMethodInfo.CreateDelegate(runtimeEvent.EventHandlerType, this);
    
        Func<Delegate, EventRegistrationToken> add = (a) => {
            return (EventRegistrationToken)runtimeEvent.AddMethod.Invoke(this.myButton, new object[] { a });
        };
    
        Action<EventRegistrationToken> remove = (a) => { runtimeEvent.RemoveMethod.Invoke(runtimeEvent, new object[] { a }); };
    
        WindowsRuntimeMarshal.AddEventHandler(add, remove, delegateHandler);
    }
    
    public void OnClick(Object sender, RoutedEventArgs e)
    {
    
    } 
    

    【讨论】:

      猜你喜欢
      • 2020-11-30
      • 1970-01-01
      • 1970-01-01
      • 2014-07-28
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-29
      相关资源
      最近更新 更多