如何在WinRT类中装饰事件?

时间:2012-08-02 09:14:08

标签: c# events windows-runtime

在经典类库中,我可以这样做:

public event EventHandler Changed
{
  add { decorated.Changed += value; }
  remove { decorated.Changed -= value; }
}

现在,如果我使用winRT类,编译器会抱怨这样的代码。我设法补丁'添加',但坚持删除:

public event EventHandler Changed
{
  add { return decorated.Changed += value; }
  remove { decorated.Changed -= value; }
}

我应该如何实施删除部分?

2 个答案:

答案 0 :(得分:1)

  

System.Runtime.InteropServices.WindowsRuntime.EventRegistrationTokenTable<T>

     

存储委托和事件令牌之间的映射,以支持在托管代码中实现Windows运行时事件。

     

当您需要手动管理事件的添加和删除时,请使用此类型。

     

此表的实例存储代表已添加到事件的事件处理程序的委托。要引发事件,请调用InvocationList属性返回的委托(如果它不是null)。每个事件都需要此表的一个实例。

例如,

private EventRegistrationTokenTable<EventHandler<Object>> _changed
     = new EventRegistrationTokenTable<EventHandler<Object>>();

public event EventHandler<Object> Changed
{
    add    { return _changed.AddEventHandler(value); }
    remove { _changed.RemoveEventHandler(value);     }
}

答案 1 :(得分:0)

一种解决方案是创建虚假后备事件和查找字典,以存储转发事件所需的信息。例如:

public event EventHandler<Object> Changed
{
  add
  {
    // get fake token so that we can return something and/or unsubscribe
    EventRegistrationToken token = _changed.AddEventHandler(value);
    // subscribe and store the token-handler pair
    _otherClass.Event += value;
    _dictionary[token] = value;
    return token;
  }
  remove
  {
    // recall value and remove from dictionary
    _otherClass.Event -= _dictionary[value];
    _dictionary.Remove(value);
    // remove it from the "fake" event
    _changed.RemoveEventHandler(value);
  }
}

private EventRegistrationTokenTable<EventHandler<Object>> _changed;
private Dictionary<EventRegistrationToken, EventHandler<Object>> _dictionary;

或者,从WinRT类订阅CLR事件可能更容易,只需将CLR事件转发给WinRT订阅者;或多或少地扭转了你所问的流量:

public WinRtObject()
{
  _otherClass.Event += (sender, o) => OnChanged(o);
}

public event EventHandler<Object> Changed;

private void OnChanged(object e)
{
  EventHandler<object> handler = Changed;
  if (handler != null)
    handler(this, e);
}