处理RoutedEvent继续冒泡树
-
27-09-2019 - |
题
我正在开发一个基于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]
我设置事件作为处理。
解决方案
仇恨回答我的问题,但这里是解决方案,我最终来到了使用。
无论跨指定的MouseDoubleClick升高每个的TreeViewItem在分支(从儿童到根)几个来源的之后,如果所述事件被处理我利用从这个问题的答案:
WPF树视图,获取的TreeViewItem在PreviewMouseDown事件
得到的TreeViewItem那是鼠标事件下。如果当前的发送者等于鼠标事件的树型视图作为所需的I展开/折叠。否则,我只是忽略事件,什么也不做。
其他提示
不知道为什么,但所选择的答案没有工作,每TreeViewItems
我。所以就用一个简单的bool
方法围栏从reeintering 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;
}
和不要忘记进行注册。
treeView.PreviewMouseDown += TreeView_PreviewMouseDown;
不隶属于 StackOverflow