我有一个简单的TreeView
类,在WPF应用程序中有几个TreeViewItem
(我自己设计)。我想要选择被点击的项目,这实际上非常简单。但是,只要用户单击不是根元素的元素,就会为其所有父元素调用MouseRightButtonUp
事件,从而导致所有父节点也被选中。这是我的代码:
public class MyTreeViewItem : TreeViewItem
{
public MyTreeViewItem()
{
this.MouseRightButtonDown += MyTreeViewItem_MouseRightButtonDown ;
}
void MyTreeViewItem_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
if (sender as MyTreeViewItem != null)
(sender as MyTreeViewItem).IsSelected = true;
}
}
在调试器中,我发现确实为每个父项单独调用MyTreeViewItem_MouseRightButtonDown
方法。我该如何避免这种情况?
答案 0 :(得分:2)
WPF中的路由事件具有Handled
属性,可以将其标记为已处理。
标记处理的事件将限制路由事件在事件路径上对侦听器的可见性。该事件仍然在路径的其余部分传播,但只有在AddHandler(RoutedEvent,Delegate,Boolean)方法调用中专门添加HandledEventsToo true的处理程序才会被响应。
您可以在代码中设置e.Handled = true;
,但不会继续触发此事件:
public class MyTreeViewItem : TreeViewItem
{
public MyTreeViewItem()
{
this.MouseRightButtonDown += MyTreeViewItem_MouseRightButtonDown ;
}
void MyTreeViewItem_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
if (sender as MyTreeViewItem != null)
{
(sender as MyTreeViewItem).IsSelected = true;
e.Handled = true;
}
}
}