WPF傳遞事件重要性體現
WPF傳遞事件在實際應用中起到了非常重要的作用。希望大家可以通過這篇文章介紹的內容,充分掌握這一方法的應用,提高自己的開發效率。#t#
WPF在.NET簡單事件通知之上添加了很多基礎結構。傳遞事件的設計使得事件可以與元素樹一起很好的工作。事件發生后,可以在視覺樹和邏輯樹自動地進行上下傳遞,我們不需要添加任何額外的代碼。
WPF傳遞事件使得我們不需要過多關注于視覺樹,這樣封裝對于我們理解WPF的元素合成非常重要。比如,我們點擊一個按鈕的事件,在點擊的時候我們實際上點擊的是一個ButtonChrome或者TextBlock,也就是說我們點擊的是Button的內容元素。正是因為事件可以沿視覺樹傳遞,Button才發現這個事件,并且可以處理。
因此,我們可以給Button的Content當中添加任意的元素,而不會對事件有任何的影響。如果沒有這樣的事件傳遞,我們點擊Button內的元素時,必須手動編寫代碼觸發Button點擊事件。
WPF傳遞事件的的實現和行為與Dependency屬性類似。同樣,我們看看如何實現簡單的傳遞事件。多數時候,傳遞事件并不比普通的.NET事件難。與Dependency屬性一樣,.NET語言(除了XAML)本身并不明白傳遞目標。這些支持都是基于WPF API。
- public class Button {
- // 傳遞的事件 public static readonly
RoutedEvent ClickEvent;- static Button() {
- // 注冊事件 Button.DoubleClickEvent =
EventManager.RegisterRoutedEvent
(“Click”, RoutingStrategy.Bubble,
typeof(RoutedEventHandler), typeof(Button)); …- }
- // .NET事件保證 (可選的)
- public event RoutedEventHandler Click {
- add { AddHandler(Button.ClickEvent, value);
- }
- remove {
- RemoveHandler(Button.ClickEvent, value);
- }
- }
- protected override void OnMouse
LeftButtonDown(MouseButtonEventArgs e) {- … // 激發事件
- RaiseEvent(new RoutedEventArgs
(Button.ClickEvent, this)); …- } …
- }
從上面的實現可以看出,事件與Dependency屬性有很多相似之處。也是定義一個靜態的RoutedEvent成員,同樣在靜態構造函數里注冊事件。為了方便,也包裝了一個普通的.NET事件。
這里的AddHandler/RemoveHandler不是從DependencyObject派生,而是更高一級的基類System.Windows.UIElement。這兩個方法為相應的事件添加/刪除一個委派。在OnMouseLeftButtonDown中,我們構造一個事件參數,傳入事件源對象this,然后調用RaiseEvent函數。
以上就是對WPF傳遞事件的相關概念解析。