2013-09-23 36 views
1

我在WinRT中創建了自定義事件的類。WinRT:自己的事件處理程序,令牌不會被刪除

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Runtime.InteropServices.WindowsRuntime; 
using System.Text; 
using System.Threading.Tasks; 

namespace BA_Lib 
{ 
    public class RTEventHandler<T> 
    { 
     private EventRegistrationTokenTable<EventHandler<T>> m_EventTokenTable = null; 

     public event EventHandler<T> Event 
     { 
      add { EventRegistrationTokenTable<EventHandler<T>>.GetOrCreateEventRegistrationTokenTable(ref m_EventTokenTable).AddEventHandler(value); return; } 
      remove { EventRegistrationTokenTable<EventHandler<T>>.GetOrCreateEventRegistrationTokenTable(ref m_EventTokenTable).RemoveEventHandler(value); } 
     } 

     public void Fire(T argument) 
     { 
      EventHandler<T> temp = EventRegistrationTokenTable<EventHandler<T>>.GetOrCreateEventRegistrationTokenTable(ref m_EventTokenTable).InvocationList; 
      if (temp != null) 
       temp(null, argument); 
     } 

     public void Fire(object sender,T argument) 
     { 
      EventHandler<T> temp = EventRegistrationTokenTable<EventHandler<T>>.GetOrCreateEventRegistrationTokenTable(ref m_EventTokenTable).InvocationList; 
      if (temp != null) 
       temp(sender, argument); 
     } 
    } 
} 

我使用這個類來創建自定義綁定到自己的事件,就像這樣:

public RTEventHandler<int> Count{get;set;} 

public void init(){Count=new RTEventHandler<int>();} 

,然後從其他類:

EventHolder.Count.Event+=myEventHandler; 

這個工程就像一個魅力,但是當我試着從EventHolder.Count.Event-=myEventHandler;事件中取消註冊,令牌留下的是表格。這會導致不需要的行爲,因爲事件處理程序會累積並多次觸發。

回答

1

我能夠解決問題,並將發佈我的最終解決方案,以供進一步參考。

問題是,RemoveEventHandler函數需要一個令牌而不是處理程序。該令牌由AddEventHandler函數返回。由於添加回復無效,我無法將此令牌傳回。我添加了一個字典來保存這個tokns並將它們連接到EventHandler。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Runtime.InteropServices.WindowsRuntime; 
using System.Text; 
using System.Threading.Tasks; 

namespace BA_Lib 
{ 
    public class RTEventHandler<T> 
    { 
     private EventRegistrationTokenTable<EventHandler<T>> m_EventTokenTable = null; 
     Dictionary<EventHandler<T>, EventRegistrationToken> _tokens = new Dictionary<EventHandler<T>, EventRegistrationToken>(); 

     public event EventHandler<T> Event 
     { 
      add 
      { 
       if (_tokens.ContainsKey(value)) 
        return; 
       var token = EventRegistrationTokenTable<EventHandler<T>>.GetOrCreateEventRegistrationTokenTable(ref m_EventTokenTable).AddEventHandler(value); 
       _tokens.Add(value, token); 
       return; 
      } 
      remove 
      { 
       if (_tokens.ContainsKey(value)) 
       { 
        var token = _tokens[value]; 
        EventRegistrationTokenTable<EventHandler<T>>.GetOrCreateEventRegistrationTokenTable(ref m_EventTokenTable).RemoveEventHandler(token); 
        _tokens.Remove(value); 
       } 
      } 
     } 

     public void Fire(T argument) 
     { 
      EventHandler<T> temp = EventRegistrationTokenTable<EventHandler<T>>.GetOrCreateEventRegistrationTokenTable(ref m_EventTokenTable).InvocationList; 
      if (temp != null) 
       temp(null, argument); 
     } 

     public void Fire(object sender, T argument) 
     { 
      EventHandler<T> temp = EventRegistrationTokenTable<EventHandler<T>>.GetOrCreateEventRegistrationTokenTable(ref m_EventTokenTable).InvocationList; 
      if (temp != null) 
       temp(sender, argument); 
     } 
    } 
} 

我在做的是跟蹤令牌和EventHanlder(要調用的函數)之間的連接。這樣我就可以解析函數中的令牌並刪除條目。