最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

WPF自定義路由事件的實(shí)例教程

 更新時(shí)間:2021年09月06日 11:51:05   作者:Charles_Su  
WPF中有兩種事件模型,一種是在WinForm時(shí)代就存在的CLR事件,另一種是WPF時(shí)代的路由事件,這篇文章主要給大家介紹了關(guān)于WPF自定義路由事件的相關(guān)資料,需要的朋友可以參考下

路由事件模型

傳統(tǒng)的簡(jiǎn)單事件模型中,在消息激發(fā)是將消息通過事件訂閱的然后交給事件的相應(yīng)者,事件的相應(yīng)者使用事件的處理器來做出相應(yīng),這樣就存在一個(gè)問題,用戶控件內(nèi)部的事件就不能被外界訂閱,因?yàn)槭录乃拗鞅仨毮軌蛑苯釉L問到事件的響應(yīng)者。

路由事件的事件擁有者和事件的相應(yīng)者之間則沒有直接的顯式訂閱關(guān)系,事件的擁有者則只負(fù)責(zé)激發(fā)事件,事件將有誰相應(yīng)它并不知道,事件的響應(yīng)者則有事件的監(jiān)聽器,針對(duì)事件進(jìn)行監(jiān)聽,當(dāng)有此類事件傳遞至此事件響應(yīng)者就使用事件處理器來相應(yīng)事件并決定此事件是否繼續(xù)傳遞。比如像上一個(gè)程序中的,點(diǎn)擊“點(diǎn)我”以后事件就開始激發(fā)了,然后事件就會(huì)在控件樹上進(jìn)行傳遞,事件的響應(yīng)者安裝了監(jiān)聽器,當(dāng)監(jiān)聽到這個(gè)事件進(jìn)行響應(yīng),并決定這個(gè)事件是否繼續(xù)傳遞。

了解了路由事件后,這節(jié)來學(xué)習(xí)一下如何自定義路由事件。

【分析代碼】

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

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

代碼一

代碼二

代碼三

代碼四

第一段是聲明了ClickEvent這一路由事件對(duì)象,這個(gè)不用多說;

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

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

  • RoutingStrategy.Tunnel:隧道式,是指事件從最外層的控件開始路由,直到路由到控件自己,就像一條自上往下的隧道,從window控件一路通到當(dāng)前觸發(fā)事件的控件;
  • RoutingStrategy.Bubble:冒泡式,這個(gè)跟隧道式相反,它是從觸發(fā)事件的控件向上傳播,直到最上層停止;
  • RoutingStrategy.Direct:直通式,跟原始事件模型一樣,不路由,直達(dá)事件處理器。

第三個(gè)參數(shù)是指定該路由事件的事件處理器是什么類型,第四個(gè)參數(shù)是指定該路由事件對(duì)象的宿主類型,第四個(gè)參數(shù)跟第一個(gè)參數(shù)共同用于路由事件對(duì)象的內(nèi)部創(chuàng)建使用:構(gòu)建hash code,確定路由事件對(duì)象唯一性,同依賴屬性一致,在一個(gè)類中不能注冊(cè)兩個(gè)同名的路由事件對(duì)象。

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

【自定義路由事件】

下面我們就來根據(jù)以上語(yǔ)法,基于ButtonBase創(chuàng)建自己的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 = "自定義路由事件被觸發(fā)了" };
            this.RaiseEvent(eventArgs);

        } 
    }

上述代碼中,我創(chuàng)建了一個(gè)MyButton,聲明了一個(gè)MessageEvent路由事件對(duì)象,值得注意的是,RegisterRoutedEvent的第三個(gè)參數(shù)我用的是:

typeof(EventHandler<MyRoutedEventArgs>)

而非:

typeof(RoutedEventHandler)

因?yàn)镽outedEventHandler的參數(shù)跟我自定義的事件參數(shù)不一致,需要使用EventHandler的泛型版指定我的事件參數(shù)類型,下面是RoutedEventHandler的聲明:

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

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

在外層Grid上設(shè)置MyButton的Message事件監(jiān)聽及處理器。

運(yùn)行效果如下:

點(diǎn)擊“你好”,彈出MessageBox提示“自定義路由事件被觸發(fā)了”。

總結(jié)

到此這篇關(guān)于WPF自定義路由事件的文章就介紹到這了,更多相關(guān)WPF自定義路由事件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C#實(shí)現(xiàn)高性能異步文件下載器詳解

    C#實(shí)現(xiàn)高性能異步文件下載器詳解

    異步文件下載器用處很大,當(dāng)我們需要實(shí)現(xiàn)大文件下載,多任務(wù)并行下載等都可以用的上,下面小編就來和大家聊聊如何使用C#實(shí)現(xiàn)高性能異步文件下載器吧
    2025-03-03
  • C# IDE VS2005中的Hosting Process (vshost.exe)作用介紹

    C# IDE VS2005中的Hosting Process (vshost.exe)作用介紹

    這篇文章主要介紹了C# IDE VS2005中的Hosting Process (vshost.exe)作用介紹,vshost.exe是一個(gè)宿主進(jìn)程,主要用來提高調(diào)試效率,需要的朋友可以參考下
    2015-01-01
  • 使用Unity3D實(shí)現(xiàn)選中物體消融特效的方法詳解

    使用Unity3D實(shí)現(xiàn)選中物體消融特效的方法詳解

    消融特效中基Shader?Graph實(shí)現(xiàn)了消融特效,本文將基于?Shader?實(shí)現(xiàn)消融特效,當(dāng)前實(shí)現(xiàn)消融特效的方法主要有?Alpha?測(cè)試消融、clip(或?discard)消融,它們的本質(zhì)都是隨機(jī)丟棄一些片元,以實(shí)現(xiàn)消融效果,文中有詳細(xì)代碼示例,需要的朋友可以參考下
    2023-10-10
  • C#適配器模式的使用

    C#適配器模式的使用

    本文主要介紹了C#適配器模式的使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • C# 通過NI-VISA操作Tektronix TBS 2000B系列示波器的實(shí)現(xiàn)步驟

    C# 通過NI-VISA操作Tektronix TBS 2000B系列示波器的實(shí)現(xiàn)步驟

    這篇文章主要介紹了C# 通過NI-VISA操作Tektronix TBS 2000B系列示波器的實(shí)現(xiàn)步驟,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下
    2021-02-02
  • 利用C#編寫掃雷游戲(附源碼)

    利用C#編寫掃雷游戲(附源碼)

    掃雷游戲相信不用給大家過多介紹,大家基本都玩過,下面這篇文章主要給大家介紹了關(guān)于如何利用C#編寫掃雷游戲的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2019-01-01
  • c# list部分操作實(shí)現(xiàn)代碼

    c# list部分操作實(shí)現(xiàn)代碼

    這篇文章主要介紹了c# list部分操作,需要的朋友可以參考下
    2013-09-09
  • C#編程總結(jié)(六)詳解異步編程

    C#編程總結(jié)(六)詳解異步編程

    本篇文章主要介紹了C#異步編程,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧。
    2016-12-12
  • C#讀寫文件的方法匯總

    C#讀寫文件的方法匯總

    C#讀寫文件的方法匯總,需要的朋友可以參考一下
    2013-03-03
  • C#動(dòng)態(tài)執(zhí)行批處理命令的方法

    C#動(dòng)態(tài)執(zhí)行批處理命令的方法

    這篇文章主要介紹了C#動(dòng)態(tài)執(zhí)行批處理命令的方法,可實(shí)現(xiàn)動(dòng)態(tài)執(zhí)行一系列控制臺(tái)命令,并允許實(shí)時(shí)顯示出來執(zhí)行結(jié)果,需要的朋友可以參考下
    2014-11-11

最新評(píng)論

寿光市| 布尔津县| 晋州市| 乐都县| 山东省| 天祝| 河南省| 酒泉市| 朝阳市| 湘乡市| 神池县| 海宁市| 安陆市| 隆德县| 东台市| 嘉义市| 深泽县| 晋中市| 北宁市| 贵州省| 府谷县| 甘孜| 三门峡市| 九寨沟县| 务川| 冷水江市| 洛阳市| 虞城县| 天等县| 田阳县| 丰顺县| 嘉禾县| 义马市| 邵武市| 鄂伦春自治旗| 潮安县| 鸡东县| 渝中区| 昌黎县| 东辽县| 嘉祥县|