欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

.NET簡(jiǎn)談路由事件

系統(tǒng) 1653 0

本篇文章講解關(guān)于路由事件的相關(guān)原理。

什么叫路由事件,字面理解就是事件是可以傳遞,路由的意思也好理解。路由事件其實(shí)就是,事件是會(huì)隨著某種變化,來(lái)回傳遞。路由事件其實(shí)在.NET2.0時(shí)期就已經(jīng)存在了,只不過(guò)在一般開(kāi)發(fā)過(guò)程中用不到。

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

路由事件在一些復(fù)雜的系統(tǒng)設(shè)計(jì)中至關(guān)重要,比如我有一個(gè)對(duì)象,這個(gè)對(duì)象是一個(gè)屬于容器類(lèi)的對(duì)象,就好比我們Windows應(yīng)用程序中的Form窗體,這個(gè)窗體用來(lái)承載一些其他的子窗體。然而這樣的遞歸性的設(shè)計(jì),經(jīng)常性的出現(xiàn)。我們?cè)诖罱ㄒ粋€(gè)界面時(shí),往這個(gè)界面上堆積了很多小的窗口。這些小的窗口又堆積了一些更小的窗口。在設(shè)計(jì)具有層次性的架構(gòu)時(shí),我們需要考慮這些對(duì)象不能被埋的太深,但是又要保持對(duì)象的結(jié)構(gòu)原理,就像下圖中所示;

1:

.NET簡(jiǎn)談路由事件
上圖可能畫(huà)的不太形象,能表達(dá)意思就行了。有一個(gè)大的對(duì)象上面堆積了很多小的對(duì)象,每個(gè)小的對(duì)象又堆積了一些小的對(duì)象。這樣的層次結(jié)構(gòu),我們經(jīng)常遇見(jiàn)。在.NET平臺(tái)上開(kāi)發(fā),基本上都是基于控件的拖拉進(jìn)行開(kāi)發(fā)的,但是這些控件都是被封裝過(guò)的,里面又包含了一些小的對(duì)象。在2.0的開(kāi)發(fā)中,控件是不支持事件路由的,比如我們?cè)谟嗛喴粋€(gè)控件的事件時(shí),這個(gè)事件可能被它上面的事件所處理了;做WINFORM的朋友經(jīng)常喜歡捕獲鼠標(biāo)單擊事件,然后編寫(xiě)事件觸發(fā)代碼。但是會(huì)發(fā)現(xiàn)只要這個(gè)控件被其他控件擋住了,那這個(gè)控件肯定是收不到Windows發(fā)給它的鼠標(biāo)單擊消息,因?yàn)槭录](méi)有路由。上面的父控件沒(méi)有考慮到它的子孫們需要這個(gè)消息,在WPF中就提供了事件路由的機(jī)制,我們可以捕獲到子控件的事件。

其實(shí)實(shí)現(xiàn)原理就是將事件向下傳遞,父控件要循環(huán)的判斷每一個(gè)子控件是否被訂閱了相關(guān)事件,如果父控件捕獲到的這個(gè)事件子控件也需要,那么就可以將事件向下路由了;

2:

.NET簡(jiǎn)談路由事件

如果我們需要框架支持路由事件的化,那么我們?cè)谇捌谠O(shè)計(jì)的時(shí)候,需要將對(duì)象進(jìn)行提取,對(duì)需要路由事件的對(duì)象進(jìn)行基類(lèi)封裝;就好比我們從Control控件的基類(lèi)開(kāi)始。

下面我們來(lái)看一個(gè)小例子,以幫助大家能理解原理,在自己開(kāi)發(fā)項(xiàng)目的時(shí)候能用的上。

一:容器對(duì)象代碼:

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

二:子對(duì)象代碼:

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

三:調(diào)用代碼:

  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簡(jiǎn)談路由事件


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

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

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 亚洲综合色婷婷久久 | 日韩亚洲欧美一区 | 国产精品99久久 | 亚州毛色毛片免费观看 | 精品国产第一国产综合精品gif | 毛片99| 天天澡天天碰天天狠伊人五月 | 精品中文字幕一区 | 免费观看一级毛片 | 草久影视 | 欧美视频在线播放 | 六月色播 | 欧美一级电影网 | 国产精品成人国产乱一区 | 亚洲一区二区三区久久精品 | 欧美在线日韩 | 涩涩天堂 | 亚洲精品www | 青青青国产依人精品视频 | 91丨九色丨首页在线观看 | 那里有毛片看 | 色综合久久天天综合网 | 欧洲中文字幕 | 日韩欧美精品在线观看 | 最新的黄色网址 | 久久亚洲国产欧洲精品一 | 一级片在线 | 亚洲色综合dddd97.com | 欧美日韩亚洲高清不卡一区二区三区 | 亚洲天堂日本 | 性猛交ⅹxxx乱巴西 无人精品乱码一区二区三区 | 成年网站在线观看 | 天天搞天天操 | 久草在线成人 | 五月天婷婷精品视频 | 一区二区三区视频 | 亚洲高清国产品国语在线观看 | 国产毛A片啊久久久久久A | xxxx日本在线 | 色淫湿视频 | 久久不射网|