我正在开发基于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]
我将事件设置为已处理。
答案 0 :(得分:1)
讨厌回答我自己的问题,但这是我最终使用的解决方案。
在遇到几个指定为分支中的每个TreeViewItem(从子级到根级)引发MouseDoubleClick的源之后,无论事件是否被处理,我都使用了这个问题的答案:
WPF TreeView, get TreeViewItem in PreviewMouseDown event
获取鼠标事件下的TreeViewItem。如果当前发送方等于鼠标事件的TreeViewItem,则根据需要展开/折叠。否则,我只是忽略了这个事件,什么都不做。
答案 1 :(得分:0)
不知道为什么,但选定的答案对我来说并不适用于每个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;
}
不要忘记注册。
treeView.PreviewMouseDown += TreeView_PreviewMouseDown;