WPF捕獲事件即使這個事件被標記為Handled

weixin_33831673發表於2013-05-09

前面的博文:WPF拖動總結 中DebugLZQ遇到的問題是:DebugLZQ給容器中所有UI控制元件註冊一個MouseLeftButton事件,Button控制元件無法捕獲這兒事件的問題,加個斷點看下,程式根本不到達這個地方。當時只是簡短的提了一下,覺得不夠,因此決定再發一篇博文來說一下。

foreach (UIElement uiEle in LayoutRoot.Children)
{
   uiEle.MouseMove += new MouseEventHandler(Element_MouseMove);
   uiEle.MouseLeftButtonDown += new MouseButtonEventHandler(Element_MouseLeftButtonDown);
   uiEle.MouseLeftButtonUp += new MouseButtonEventHandler(Element_MouseLeftButtonUp);                
}

有人說更改Button控制元件的ClickedMode=Hover,DebugLZQ試了下問題多多,瞎扯淡。

類似的問題還有,如我想實現拖動TextBox控制元件的時候也不行,MouseLeftButtonDown事件依然無法觸發。

用的更多的場景是,我程式中有一個第三方控制元件,我需要捕獲這個控制元件的某個路由事件,但是這個事件在該第三方控制元件的事件處理中被標記為Handled=true,我們可以怎麼來做?

下面是解決問題的程式碼片段:

if (uiEle is Button || uiEle is TextBox)
{
   uiEle.AddHandler(Button.MouseLeftButtonDownEvent, new MouseButtonEventHandler(Element_MouseLeftButtonDown), true);
}

這個程式碼的關鍵點是最後那個true,它告訴wpf引擎call這個handle,即使它被標記為Handled=true。
由此可見,WPF路由事件被標記為handled以後,並不是不在visual tree上傳遞了;而是,不去call這個handler了。

希望對你有幫助~

相關文章