亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

.NET簡談路由事件

系統 1790 0

本篇文章講解關于路由事件的相關原理。

什么叫路由事件,字面理解就是事件是可以傳遞,路由的意思也好理解。路由事件其實就是,事件是會隨著某種變化,來回傳遞。路由事件其實在.NET2.0時期就已經存在了,只不過在一般開發過程中用不到。

從C#3.0開始,就已經封裝了關于路由事件的機制。其實這種實現應該可以換個名字來解釋。我們可以給路由事件起個便于理解的名字,“事件的路由設計模式”。我們都知道,任何大的框架都是從微小的基本語法開始編寫的,平臺、語言給我們提供的僅僅是一些能滿足日常需求的東西;好東西還得我們自己去寫、去創新。在常見的設計模式中,少不了對事件的使用,本人深有體會。是不是高手,不能用他會哪種框架、會哪種語言,而是要看他對他使用的語言所理解程度,能否將一門語言玩的爐火純青,能否寫出高效、簡單的框架;這才是高手。這也是很多初學者所喜歡犯的毛病。

路由事件在一些復雜的系統設計中至關重要,比如我有一個對象,這個對象是一個屬于容器類的對象,就好比我們Windows應用程序中的Form窗體,這個窗體用來承載一些其他的子窗體。然而這樣的遞歸性的設計,經常性的出現。我們在搭建一個界面時,往這個界面上堆積了很多小的窗口。這些小的窗口又堆積了一些更小的窗口。在設計具有層次性的架構時,我們需要考慮這些對象不能被埋的太深,但是又要保持對象的結構原理,就像下圖中所示;

1:

.NET簡談路由事件
上圖可能畫的不太形象,能表達意思就行了。有一個大的對象上面堆積了很多小的對象,每個小的對象又堆積了一些小的對象。這樣的層次結構,我們經常遇見。在.NET平臺上開發,基本上都是基于控件的拖拉進行開發的,但是這些控件都是被封裝過的,里面又包含了一些小的對象。在2.0的開發中,控件是不支持事件路由的,比如我們在訂閱一個控件的事件時,這個事件可能被它上面的事件所處理了;做WINFORM的朋友經常喜歡捕獲鼠標單擊事件,然后編寫事件觸發代碼。但是會發現只要這個控件被其他控件擋住了,那這個控件肯定是收不到Windows發給它的鼠標單擊消息,因為事件沒有路由。上面的父控件沒有考慮到它的子孫們需要這個消息,在WPF中就提供了事件路由的機制,我們可以捕獲到子控件的事件。

其實實現原理就是將事件向下傳遞,父控件要循環的判斷每一個子控件是否被訂閱了相關事件,如果父控件捕獲到的這個事件子控件也需要,那么就可以將事件向下路由了;

2:

.NET簡談路由事件

如果我們需要框架支持路由事件的化,那么我們在前期設計的時候,需要將對象進行提取,對需要路由事件的對象進行基類封裝;就好比我們從Control控件的基類開始。

下面我們來看一個小例子,以幫助大家能理解原理,在自己開發項目的時候能用的上。

一:容器對象代碼:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. namespace 路由事件
  5. {
  6. ///<summary>
  7. ///容器類
  8. ///</summary>
  9. public class Container
  10. {
  11. ///<summary>
  12. ///鼠標單擊事件
  13. ///</summary>
  14. public event EventHandlerClick;
  15. ///<summary>
  16. ///子對象集合
  17. ///</summary>
  18. private List<Child>childlist= new List<Child>();
  19. ///<summary>
  20. ///觸發當前對象的Click事件
  21. ///</summary>
  22. public void OnClick()
  23. {
  24. Click( "父對象接受到Click事件" , null ); //觸發當前父容器的事件
  25. foreach (Childc in childlist)
  26. {
  27. c.OnClick();
  28. }
  29. }
  30. ///<summary>
  31. ///添加子對象方法
  32. ///</summary>
  33. ///<paramname="c"></param>
  34. public void Add(Childc)
  35. {
  36. childlist.Add(c);
  37. }
  38. }
  39. }

二:子對象代碼:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. namespace 路由事件
  5. {
  6. ///<summary>
  7. ///子對象
  8. ///</summary>
  9. public class Child
  10. {
  11. ///<summary>
  12. ///鼠標單擊事件
  13. ///</summary>
  14. public event EventHandlerClick;
  15. public void OnClick()
  16. {
  17. Click( "子對象接受到Click事件" , null );
  18. }
  19. }
  20. }

三:調用代碼:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. namespace 路由事件
  5. {
  6. class Program
  7. {
  8. static void Main( string []args)
  9. {
  10. Containercontainerobject= new Container();
  11. containerobject.Click+= new EventHandler(containerobject_Click);
  12. Childchildobject= new Child();
  13. childobject.Click+= new EventHandler(childobject_Click);
  14. containerobject.Add(childobject);
  15. if (Console.ReadLine()== "StartClick" )
  16. {
  17. containerobject.OnClick();
  18. }
  19. }
  20. static void childobject_Click( object sender,EventArgse)
  21. {
  22. Console.WriteLine((sender as string ));
  23. Console.ReadLine();
  24. }
  25. static void containerobject_Click( object sender,EventArgse)
  26. {
  27. Console.WriteLine((sender as string ));
  28. Console.ReadLine();
  29. }
  30. }
  31. }

.NET簡談路由事件


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 天天做日日做 | 女人18一级特级毛片免费看 | 亚洲在线激情 | 一级大片视频 | 国产最新一区二区三区天堂 | 久久久久久久亚洲精品 | 波多野结衣中文字幕一区 | 国产综合成人久久大片91 | 在线视频不卡国产在线视频不卡 | 亚洲精品综合一区二区三区在线 | 成人午夜爱爱爱爱爱 | 国产日产精品久久久久快鸭 | 香蕉人人超人人超免费看视频 | 香蕉视频在线免费看 | 日本一道一区 | 九九视频网站 | 国产精品九九九久久九九 | 五月综合激情视频在线观看 | 九九精品免费视频 | 国产v欧美v日本v精品 | 欧美精品国产第一区二区 | 久久91精品牛牛 | youjizz欧美粗又大中国 | 欧美精品日韩一区二区三区 | 亚洲欧美日韩国产专区一区 | 手机福利片 | 国产另类图片 | 国产成人亚洲精品 | 午夜久久久久久 | 亚欧精品一区二区三区 | 久久婷婷国产麻豆91天堂 | 亚洲综合精品一区二区三区中文 | 女人牲交视频一级毛片 | 亚洲和欧美毛片久久久久 | 久久成人国产精品青青 | 精品精品国产高清a毛片 | 中文字幕在线最新在线不卡 | 欧美va亚洲va在线观看蝴蝶网 | 色婷婷色综合激情国产日韩 | 九九热观看视频 | 欧美精品久久久久久久影视 |