前面的博文: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了。
希望對你有幫助~