处理过的RoutedEvent继续冒泡树
我正在开发一个基于TreeView
的控件,我的双击事件继续冒泡我的TreeViewItem
节点。
目标是在双击时让TreeViewItem
展开或折叠。
我有一个样式,将MouseDoubleClick
事件的事件处理程序应用于每个TreeViewItem
。
这是处理事件的代码
private void TreeViewItemDoubleClicked( object sender, RoutedEventArgs e ) { // Get the specific tree view item that was double clicked TreeViewItem treeViewItem = sender as TreeViewItem; // not null? if( null != treeViewItem ) { // Switch expanded state if( true == treeViewItem.IsExpanded ) { treeViewItem.IsExpanded = false; } else { treeViewItem.IsExpanded = true; } // Set event handled e.Handled = true; // [1] } }
这适用于顶级TreeViewItem
但是当双击子项时,事件会在树中冒泡,导致整个分支崩溃。 为什么事件继续泡沫? 如上所述[1]
我将事件设置为已处理。
讨厌回答我自己的问题,但这是我最终使用的解决方案。
在遇到几个指定为分支中的每个TreeViewItem(从子级到根级)引发MouseDoubleClick的源之后,无论事件是否被处理,我都使用了这个问题的答案:
WPF TreeView,在PreviewMouseDown事件中获取TreeViewItem
获取鼠标事件下的TreeViewItem。 如果当前发送方等于鼠标事件的TreeViewItem,则根据需要展开/折叠。 否则,我只是忽略了这个事件而什么都不做。
不知道为什么,但选择的答案对我来说并不适用于每个TreeViewItems
。 因此,我使用了一种简单的bool
方法,不止一次地重新烧结TreeViewItemDoubleClicked
。
private void TreeViewItemDoubleClicked( object sender, RoutedEventArgs e ) { // Make sure the event has never been handled first if (bubblingBulkwark) return; // Get the specific tree view item that was double clicked TreeViewItem treeViewItem = sender as TreeViewItem; // not null? if( null != treeViewItem ) { // Switch expanded state if( true == treeViewItem.IsExpanded ) { treeViewItem.IsExpanded = false; } else { treeViewItem.IsExpanded = true; } // Raise bulkwark bubblingBulkwark = true; } }
要允许调用的第一个处理程序完全执行(因此依赖于在父项的父级之前调用子级处理程序这一事实),只需添加:
private void TreeView_PreviewMouseDown(object sender, MouseButtonEventArgs e) { bubblingBulkwark = false; }
并且不要忘记注册它。
上述就是C#学习教程:处理过的RoutedEvent继续冒泡树分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
treeView.PreviewMouseDown += TreeView_PreviewMouseDown;
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/999784.html