2011-08-24 42 views
2

創建活動中,我是新來WPF,和我使用這本書有關事件的章節中學習專業WPF C#2010理解有問題,並在WPF

現在,這本書介紹瞭如何創建活動和註冊事件在WPF中,它給出了一個例子,來自ButtonBase類的代碼,它是從代碼中沒有提到的其他類派生出來的。

我們瞭解大局,我也試圖創建自己的簡單的類,並試圖註冊一個事件,我將在稍後嘗試提高(只是我自己的理解)。

這是我寫的代碼:

using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Text; 
    using System.Windows; 
    using System.Windows.Input; 

    namespace WPFRoutedEvents 
    { 
      public class EventTest 
      { 
      private string variable = "Event has occured"; 

      public static readonly RoutedEvent myTestEvent; 

      //Constructor 
      public static EventTest() 
      { 
       EventTest.myTestEvent = EventManager.RegisterRoutedEvent("TestEvent", RoutingStrategy.Bubble, typeof (RoutedEventHandler), typeof(EventTest)); 
      } 

      public string getVariable() 
      { 
       return this.variable; 
      } 

      public event RoutedEventHandler myTestEvent 
      { 
       add 
       { 
         //Here is the problem 
         // I cannot use base.AddHandler() because it does not exist 
       } 

       remove 
       { 
        //Here is the problem 
        // I cannot use base.RemoveHandler() because it does not exist 
       } 
      } 




     }// end of class EventTest 
    } 

現在,因爲這個類沒有從任何類派生的,我不能訪問基類的功能的AddHandler。

我的問題有以下幾點:

1)班有原來的AddHandler功能實現從我需要延長我的課嗎? 2)有人請簡單地解釋一下從編寫和事件到管道的最終設置,直到事件發生時它會調用處理程序,即從實現事件,事件處理程序,註冊事件,定義事件事件處理程序(編碼部分)的語法,以及從發生en事件到處理事件(實際執行事件和事件處理程序)時的流水線。它會增加我對文本的理解。

3)我在書中找到什麼是ClickEvent其中已經實施的地方,被創建,註冊,最後處理。我想知道的是程序員將如何註冊一些尚未實現的新類型的事件(例如,可能是三重點擊,只是爲了舉例,否則我知道它存在),然後註冊該事件,然後設計一個處理器。

4)是否有任何類型的事件,或一些其它等效的,在數據​​(一些變量,資源等),而不是一些輸入裝置事件的特定狀態發生?比如拖拉畫線時,它會達到特定的長度?

謝謝!

回答

2

的RoutedEvent系統圍繞UIElement類及其AddHandler method居中。
您應該只在繼承UIElement的類中創建路由事件。

所有其他類應使用普通的CLR事件。


當您註冊一個路由事件,UIElement將準備存儲處理程序在你的類的實例的事件。
當你調用AddHandler,會的UIElement的處理程序添加到像一個Dictionary<RoutedEvent, Delegate>
當您在XAML中添加事件處理程序時,生成的MyFile.xaml.g.cs代碼將使用CLR事件訪問器添加處理程序。 當您調用RaiseEvent時,UIElement將遍歷其字典並調用每個處理程序。

有關C#場式和自定義事件的更多信息,請參閱my blog