【问题标题】: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)来找出我做错了什么。每个项目都显示出同样的问题。
我用谷歌搜索了几个小时......我发现的每个实现都声明“添加”需要一个返回对象。
我的问题是:
- 有人知道这是否是错误吗?
- 如果不是错误...是否需要设置或更改某些内容才能让我的事件返回令牌?
- 如果事件在您的环境中表现得像应有的那样,能否请您提供一个测试项目,以便我进行比较。也许这与项目设置或类型有关。
编辑:终于可以添加图片了...
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)
{
}