亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

WPF如何自定義路由事件

發布時間:2021-09-06 13:44:31 來源:億速云 閱讀:150 作者:小新 欄目:開發技術

這篇文章主要為大家展示了“WPF如何自定義路由事件”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“WPF如何自定義路由事件”這篇文章吧。

路由事件模型

傳統的簡單事件模型中,在消息激發是將消息通過事件訂閱的然后交給事件的相應者,事件的相應者使用事件的處理器來做出相應,這樣就存在一個問題,用戶控件內部的事件就不能被外界訂閱,因為事件的宿主必須能夠直接訪問到事件的響應者。

路由事件的事件擁有者和事件的相應者之間則沒有直接的顯式訂閱關系,事件的擁有者則只負責激發事件,事件將有誰相應它并不知道,事件的響應者則有事件的監聽器,針對事件進行監聽,當有此類事件傳遞至此事件響應者就使用事件處理器來相應事件并決定此事件是否繼續傳遞。比如像上一個程序中的,點擊“點我”以后事件就開始激發了,然后事件就會在控件樹上進行傳遞,事件的響應者安裝了監聽器,當監聽到這個事件進行響應,并決定這個事件是否繼續傳遞。

了解了路由事件后,這節來學習一下如何自定義路由事件。

【分析代碼】

在演示代碼前,我們不妨先看一段Button按鈕的Click路由事件源碼,從源碼中學習一下如何定義路由事件。

在ButtonBase中,跟Click路由事件相關的有如下四處代碼:

代碼一

WPF如何自定義路由事件

代碼二

WPF如何自定義路由事件

代碼三

WPF如何自定義路由事件

代碼四

WPF如何自定義路由事件

第一段是聲明了ClickEvent這一路由事件對象,這個不用多說;

第二段是聲明了ClickEvent路由事件對象的包裝器,它類似于屬性的get,set,方便我們從外部把路由事件的處理器附加到路由事件上。當外部進行“+=”操作時,內部就會執行add塊,將事件處理附加到Click路由事件上,反之執行“-=”操作時,會執行remove塊中的內容;

第三段是構造方法中構建Click路由事件對象,跟創建依賴對象類似的是,路由事件對象的創建也不是直接new,而是通過EventManager類的RegisterRoutedEvent方法進行注冊,該方法第一個參數是路由事件的名稱,微軟約定路由事件名稱要跟路由事件對象的包裝器名稱一致,并且跟路由事件對象去掉Event后綴的字樣也要一致。第二個參數是指路由事件的策略,也就是事件傳播的形式,有如下三種枚舉:

  • RoutingStrategy.Tunnel:隧道式,是指事件從最外層的控件開始路由,直到路由到控件自己,就像一條自上往下的隧道,從window控件一路通到當前觸發事件的控件;

  • RoutingStrategy.Bubble:冒泡式,這個跟隧道式相反,它是從觸發事件的控件向上傳播,直到最上層停止;

  • RoutingStrategy.Direct:直通式,跟原始事件模型一樣,不路由,直達事件處理器。

第三個參數是指定該路由事件的事件處理器是什么類型,第四個參數是指定該路由事件對象的宿主類型,第四個參數跟第一個參數共同用于路由事件對象的內部創建使用:構建hash code,確定路由事件對象唯一性,同依賴屬性一致,在一個類中不能注冊兩個同名的路由事件對象。

第四段是激發Click路由事件的方法,事件參數就是在此方法中處理,它是路由事件傳播之源。

【自定義路由事件】

下面我們就來根據以上語法,基于ButtonBase創建自己的Click路由事件:

public class MyRoutedEventArgs : RoutedEventArgs
    {
        public MyRoutedEventArgs(RoutedEvent routedEvent, object source)
            : base(routedEvent, source) { }

        public string RoutedMessage { get; set; }
    }

    public class MyButton : ButtonBase
    {

        public static readonly RoutedEvent MessageEvent =
           EventManager.RegisterRoutedEvent("Message", RoutingStrategy.Bubble,
               typeof(EventHandler<MyRoutedEventArgs>), typeof(MyButton));

        public event RoutedEventHandler Message
        {
            add { this.AddHandler(MessageEvent, value); }
            remove { this.RemoveHandler(MessageEvent, value); }
        }

        protected override void OnClick()
        {
            base.OnClick();

            MyRoutedEventArgs eventArgs =  new MyRoutedEventArgs(MessageEvent, this) 
                                                { RoutedMessage = "自定義路由事件被觸發了" };
            this.RaiseEvent(eventArgs);

        } 
    }

上述代碼中,我創建了一個MyButton,聲明了一個MessageEvent路由事件對象,值得注意的是,RegisterRoutedEvent的第三個參數我用的是:

typeof(EventHandler<MyRoutedEventArgs>)

而非:

typeof(RoutedEventHandler)

因為RoutedEventHandler的參數跟我自定義的事件參數不一致,需要使用EventHandler的泛型版指定我的事件參數類型,下面是RoutedEventHandler的聲明:

WPF如何自定義路由事件

該參數類型是RoutedEventArgs,而我使用的是自定義的MyRoutedEventArgs類型。

XAML部分及事件處理器的代碼為:

WPF如何自定義路由事件

在外層Grid上設置MyButton的Message事件監聽及處理器。

運行效果如下:

WPF如何自定義路由事件

點擊“你好”,彈出MessageBox提示“自定義路由事件被觸發了”。

以上是“WPF如何自定義路由事件”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

wpf
AI

丰城市| 琼结县| 壤塘县| 阳原县| 武胜县| 德格县| 邛崃市| 沙坪坝区| 青神县| 北流市| 东光县| 饶阳县| 青海省| 庆安县| 宜昌市| 汝南县| 都江堰市| 阜康市| 灵丘县| 定襄县| 邳州市| 白山市| 湖南省| 海晏县| 周至县| 岳阳市| 虹口区| 二手房| 贵阳市| 文登市| 库车县| 高州市| 连州市| 根河市| 云龙县| 嘉荫县| 禄丰县| 垣曲县| 扶沟县| 灵台县| 佛教|