2011-06-01 96 views
25

問題是,畢竟我的研究仍然找不到常規路由事件和附加事件之間的區別。功能區別是什麼?或者其他人同意沒有?WPF附加事件vs非附加事件

執行

ButtonBase類聲明一個名爲ClickEvent的路由事件;一個正常的路由事件。

public static readonly RoutedEvent ClickEvent = EventManager.RegisterRoutedEvent("Click", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(ButtonBase)); 

[Category("Behavior")] 
public event RoutedEventHandler Click 
{ 
    add 
    { 
     base.AddHandler(ClickEvent, value); 
    } 
    remove 
    { 
     base.RemoveHandler(ClickEvent, value); 
    } 
} 

Mouse類聲明瞭一個名爲MouseDownEvent的路由事件;附加事件。

public static readonly RoutedEvent MouseDownEvent = EventManager.RegisterRoutedEvent("MouseDown", RoutingStrategy.Bubble, typeof(MouseButtonEventHandler), typeof(Mouse)); 

public static void AddMouseDownHandler(DependencyObject element, MouseButtonEventHandler handler) 
{ 
    UIElement.AddHandler(element, MouseDownEvent, handler); 
} 

public static void RemoveMouseDownHandler(DependencyObject element, MouseButtonEventHandler handler) 
{ 
    UIElement.RemoveHandler(element, MouseDownEvent, handler); 
} 

這兩個事件都在EventManager中註冊,並以同樣的方式存儲爲公共,靜態,只讀字段。 ClickEvent有一個支持CLR的事件字段,它具有自定義添加和刪除訪問器,分別調用base.AddHandler和base.RemoveHandler;這兩者都是在ButtonBase派生自的UIElement基類中聲明的。相反,MouseDownEvent有兩個靜態方法AddMouseDownHandler和RemoveMouseDownHandler,它們最終調用與UIElement中聲明的相同的兩個AddHandler和RemoveHandler方法,就像ClickEvent一樣。

在靜態類上聲明的實際附加事件的Add * Handler和Remove * Handler靜態方法必須遵循特定的命名約定,以允許WPF事件系統在運行時使用反射來查找相應的添加和刪除處理程序。


用法

這兩個事件可具有附連在XAML處理程序如下:

// Attach ClickEvent handler. 
myGrid.AddHandler(Button.ClickEvent, new RoutedEventHandler(Grid_Click)); 

// Attach MouseDownEvent handler. 
Mouse.AddMouseDownHandler(myGrid, Grid_MouseDown); 

如:

<Grid Button.Click="Grid_Click" 
     Mouse.MouseDown="Grid_MouseDown"> 
</Grid> 

這兩個事件都可以在代碼如下貼您可以看到兩個事件都可以附加到不具有的元素或宣佈他們。


結論 - 什麼是附加事件?

MSDN文檔: http://msdn.microsoft.com/en-us/library/bb613550.aspx

可擴展應用程序標記語言 (XAML)限定語言組件 和事件的類型,稱爲一個附加 事件。附加的 事件的概念使您能夠將 特定事件的處理程序添加到任意 元素,而不是添加到 實際定義或繼承 事件的元素。在這種情況下,可能引起事件 的目標對象和目標處理實例 都不定義或以其他方式「擁有」該事件。

此外,官方MCTS培訓工具包的考試70-511 - Windows應用程序開發與微軟。NET Framework 4種的狀態:

這是可能的控件來定義 一個處理程序,該 控制不能自身引發事件。這些 事件被稱爲附加事件。例如,考慮網格中的按鈕控件 。 Button類定義了一個 Click事件,但是Grid類沒有使用 。但是,仍然可以通過 在XAML代碼中將 按鈕控件的Click事件附加到網格中的按鈕定義 處理程序。

「附加事件」一詞在整個Microsoft學習資源中似乎都很模糊,儘管很明顯這裏有兩個不同但非常緊密相關的概念:附加事件和XAML附加事件語法。我引用的兩個微軟源代碼似乎都是指XAML附加事件語法,而不是實際附加事件。但是,附加的事件概述MSDN頁面會繼續向您展示如何實施實際附加的事件,而培訓套件不會。

Mouse.MouseDownEvent是在具有相應的靜態添加和刪除處理程序(也稱爲附加事件)的靜態類上聲明的路由事件的示例。但是,ButtonBase.ClickEvent是一個正常的路由事件,儘管它仍可以與實際附加事件相同的方式與XAML附加事件語法一起使用。

實際附加事件的目的是它允許開發人員爲現有的UIElement派生類聲明新的路由事件而不必對它們進行子類化;這意味着您可以附加新的路由事件,而無需將它們實際存在於您想要引發或處理的類上。但是,等一下...並不是純粹路由事件的首要目的?

MSDN上的路由事件概述頁指出:http://msdn.microsoft.com/en-us/library/ms742806.aspx

功能定義:路由事件 是一種事件可以調用多個監聽 處理器在 元素樹,而不是僅僅對引發該事件的對象 。

從該功能定義看來,任何路由事件本質上都提供了與附加事件相同的確切功能。所以基本上,附加的事件實際上只是一種在靜態類上聲明路由事件的方法,並沒有真正爲正常路由事件提供任何好處。

讓我知道你的想法,因爲我可能會錯過這裏的東西。

感謝, 蒂姆·瓦倫丁

+1

的問題是,我所有的研究後,我仍然無法找到一個普通路由事件和附加事件之間的差別。功能區別是什麼?或者其他人同意沒有? – 2011-06-02 15:15:44

+3

附加事件是可以附加到任何對象的事件,而不僅僅是定義事件的對象。路由事件是一個事件,可以被路由到處理程序而不是對象的一部分。事件既可以是路由事件也可以是附加事件。例如,'Button.Click'是一個附加事件,因爲您可以將該事件附加到除Button按鈕之外的其他對象。它也是一個路由事件,因爲它可以由UI樹中的多個Button.Click事件處理程序處理,除非您停止這種行爲,例如將事件標記爲在其中一個處理程序中處理 – Rachel 2012-11-08 20:39:14

回答

4

的差異主要是語法,無論是委託引用正在WPF的eventmanager進行處理,但什麼附加的事件給你的是無需臃腫所有的類申報通用功能的能力實現。

在普通路由事件的情況下,該類提供的接口能夠在某個時刻通過調用事件處理程序來響應事件。但是所有WPF需要知道的是它是否是從給定類型派生的對象,以及是否註冊了處理程序。這意味着我們可以製作更簡單的類層次結構,並支持開放原則(Open to Extension,Closed to Modification)。通過這種方式,程序員可以定義幾個類應該具有但不需要修改原始類的新行爲。

又見Attached Properties