我正在开发一个基于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]所指出的,我将事件设置为已处理。
发布于 2010-08-11 05:32:53
我讨厌回答我自己的问题,但这是我最终使用的解决方案。
在遇到一些来源,指定分支中的每个TreeViewItem (从子到根)都会引发MouseDoubleClick,而不管事件是否得到处理后,我使用了这个问题的答案:
WPF TreeView, get TreeViewItem in PreviewMouseDown event
以获取鼠标事件下的TreeViewItem。如果当前发送者等于鼠标事件的TreeViewItem,我会根据需要展开/折叠。否则,我将忽略该事件,什么也不做。
发布于 2018-04-15 22:43:56
不知道为什么,但选择的答案并不适用于我的每一个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;https://stackoverflow.com/questions/3444523
复制相似问题