【WPF】ListBox嵌套与事件冒泡
生活随笔
收集整理的這篇文章主要介紹了
【WPF】ListBox嵌套与事件冒泡
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【WPF】ListBox嵌套與事件冒泡 原文:【WPF】ListBox嵌套與事件冒泡
問題:兩個ListBox嵌套后,當鼠標位于內部ListBox上,鼠標滾輪事件會被內部ListBox接收,導致外層ListBox不能用鼠標滾輪滑動!現在的需求是該事件要能給外部ListBox處理,即嵌套的ListBox應該由外層ListBox來接收鼠標滾輪事件。
<ListBox><ListBox><ListBox.ItemTemplate><DataTemplate> <!-- 省略 --></DataTemplate><ListBox.ItemTemplate></ListBox> </ListBox>思路:根據WPF的冒泡路由事件,鼠標滾輪事件首先會被內層的ListBox接收。此時該事件被攔截后直接將它標記為已處理(不讓內部ListBox的滾輪滑動),然后再手動激發一個鼠標滾輪事件,該事件自動向上冒泡就能被外層ListBox接收到。
給內層ListBox注冊一個鼠標滾輪事件。
<ListBox x:Name="innerLB" PreviewMouseWheel="innerLB_PreviewMouseWheel">后臺代碼處理該事件。
/// <summary> /// 問題:內層的ListBox攔截了鼠標滾輪事件,導致外層ListBox不能用鼠標滾輪滑動。 /// 辦法:內層ListBox攔截鼠標滾輪事件后,再手動激發一個鼠標滾輪事件,讓事件冒泡給外層ListBox接收到。 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void innerLB_PreviewMouseWheel(object sender, MouseWheelEventArgs e) {if (!e.Handled){// 內層ListBox攔截鼠標滾輪事件e.Handled = true;// 激發一個鼠標滾輪事件,冒泡給外層ListBox接收到var eventArg = new MouseWheelEventArgs(e.MouseDevice, e.Timestamp, e.Delta);eventArg.RoutedEvent = UIElement.MouseWheelEvent;eventArg.Source = sender;var parent = ((Control)sender).Parent as UIElement;parent.RaiseEvent(eventArg);} }?
參考:
- ListBox攔截滾輪滾動事件
- WPF冒泡路由事件
轉載于:https://www.cnblogs.com/lonelyxmas/p/9628886.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的【WPF】ListBox嵌套与事件冒泡的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用Apache搭建个人用户主页
- 下一篇: set-matrix-zeroes当元素