日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
聊聊WPF繼續(xù)響應(yīng)被標(biāo)記為已處理事件的方法

本文轉(zhuǎn)載自微信公眾號「CSharp編程大全」,作者zls365 。轉(zhuǎn)載本文請聯(lián)系CSharp編程大全公眾號。

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價值的長期合作伙伴,公司提供的服務(wù)項目有:域名申請、網(wǎng)頁空間、營銷軟件、網(wǎng)站建設(shè)、猇亭網(wǎng)站維護、網(wǎng)站推廣。

WPF中在冒泡事件或者隧道事件會隨其層間關(guān)系在visual tree上層層傳遞,但是,某些事件傳遞到某些控件是即會”終止“(不再響應(yīng)相應(yīng)的注冊事件),給人一種事件終結(jié)者的印象。例如:textbox對mousdown事件。

產(chǎn)生原因:事件處理到達該控件后,其事件對象屬性Handled被標(biāo)記為True。WPF事件引擎在處理控件對應(yīng)事件時,若檢測到該屬性為True,就不會調(diào)用相應(yīng)的處理程序。即 WPF路由事件被標(biāo)記為handled以后, 并不是不在visual tree上傳遞了;而是,事件引擎不再去調(diào)用這個事件的handler了。

若仍想再其上層元素中(上層是相對事件的傳遞方向而言)仍然處理響應(yīng)的事件,解決方式:

1、若上層控件可以注冊相應(yīng)事件。即沒有重寫對應(yīng)控件的Template屬性。直接上代碼:

 
 
 
  1.      
  2.                          
  3.  
 
 
 
  1. private void txt_MouseDown(object sender, MouseEventArgs e) 
  2.   { 
  3.      MessageBox.Show("TextMouseDown事件"); 
  4.      e.Handled = false;//使冒泡繼續(xù)上傳 
  5.   } 
  6.  
  7. private void Grid_MouseDown(object sender, MouseEventArgs e) 
  8.   { 
  9.      MessageBox.Show("GridMouseDown事件"); 
  10.   } 

2、當(dāng)自定義控件模板時,綁定模版事件不起效,此時用上面的方法不再生效。例如:自定義列表控件模版樣式

 
 
 
  1.              xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  
  2.              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"  
  3.              xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"   
  4.              xmlns:d="http://schemas.microsoft.com/expression/blend/2008"   
  5.              mc:Ignorable="d"   
  6.              d:DesignHeight="290" d:DesignWidth="180">  
  7.       
  8.                  
  9.                           
  10.                               
  11.                                   
  12.                                     
  13.                                                  Padding="{TemplateBinding Padding}" MouseLeftButtonDown="MouseLeftButtonDown">  
  14.                                           
  15.                                       
  16.                                   
  17.                               
  18.                           
  19.                         
  20.                           
  21.                               
  22.                                   
  23.                                       
  24.                                           
  25.                                           
  26.                                           
  27.                                       
  28.                                       
  29.                                       
  30.                                       
  31.                                   
  32.                               
  33.                           
  34.                           
  35.                               
  36.                                   
  37.                               
  38.                           
  39.                           
  40.                               
  41.                           
  42.                       
  43.                   
  44.   

ScrollViewer在控件模版中,ScrollViewer的MouseButtonDown事件處理事件如下:斷點設(shè)置會發(fā)現(xiàn)鼠標(biāo)點擊時并不會觸發(fā)。

 
 
 
  1. private void MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
  2.    { 
  3.       //e.Handled = false ; 
  4.    } 

解決辦法:UIElement.AddHandler 方法:為指定的路由事件添加路由事件處理程序,并將該處理程序添加到當(dāng)前元素的處理程序集合中。具體解釋詳見:https://docs.microsoft.com/zh-cn/dotnet/api/system.windows.uielement.addhandler?f1url=https%3A%2F%2Fmsdn.microsoft.com%2Fquery%2Fdev15.query%3FappId%3DDev15IDEF1%26l%3DZH-CN%26k%3Dk(System.Windows.UIElement.AddHandler);k(TargetFrameworkMoniker-.NETFramework,Version%3Dv4.5);k(DevLang-csharp)%26rd%3Dtrue&view=netframework-4.8

大體意思:由于WPF事件visual tree上傳遞過程中,某個元素將該事件標(biāo)記為已處理,導(dǎo)致事件在傳遞時不再繼續(xù)有響應(yīng),(原因:Handled被標(biāo)記為True)如果希望后續(xù)元素也能響應(yīng)此方法,可以使用此方法。

因此我們可以在上面UserControl的構(gòu)造函數(shù)中添加下面代碼:表示gridMain處理相應(yīng)鼠標(biāo)點擊事件

 
 
 
  1. public UserControl() 
  2.         { 
  3.              InitializeComponent(); 
  4.  
  5.             gridMain.AddHandler(MouseLeftButtonDownEvent, new MouseButtonEventHandler(MouseLeftButtonDown), true); 
  6.        } 

再次斷點調(diào)試MouseLeftButtonDown,會發(fā)現(xiàn)斷點命中。

AddHandler這個代碼的關(guān)鍵點是最后那個true,它告訴WPF引擎相應(yīng)元素call這個handle,即使它被標(biāo)記為Handled=true。但是元素處理后其上層元素也照樣不會相應(yīng),因為handle仍被標(biāo)記已處理。由此可見,WPF路由事件被標(biāo)記為handled以后,并不是不在visual tree上傳遞了;而是,不去call這個handler了。

上例中如果想要UserControl繼續(xù)響應(yīng),處境就與1一樣了,只需將handle標(biāo)記為false即可。


名稱欄目:聊聊WPF繼續(xù)響應(yīng)被標(biāo)記為已處理事件的方法
分享地址:http://m.5511xx.com/article/ccdjjjp.html