C# WPF treeview如何在treeview中而不是在treeview项目上处理鼠标单击?

C# WPF treeview如何在treeview中而不是在treeview项目上处理鼠标单击?,c#,wpf,xaml,treeview,C#,Wpf,Xaml,Treeview,我想知道我会怎么做。我不能很好地检查鼠标是否在项目1,项目2,…,可以吗?应该有更好的办法。如果用户单击非项目空间,我只想取消选择所有项目。你可以做你想做的事。。。在处理程序中,单击处理程序,添加以下代码: HitTestResult hitTestResult = VisualTreeHelper.HitTest(uiElement, DragStartPosition); TreeViewItem listBoxItem = hitTestResult.VisualHit.GetParent

我想知道我会怎么做。我不能很好地检查鼠标是否在项目1,项目2,…,可以吗?应该有更好的办法。如果用户单击非项目空间,我只想取消选择所有项目。

你可以做你想做的事。。。在
处理程序中,单击
处理程序,添加以下代码:

HitTestResult hitTestResult = VisualTreeHelper.HitTest(uiElement, DragStartPosition);
TreeViewItem listBoxItem = hitTestResult.VisualHit.GetParentOfType<TreeViewItem>();
if (listBoxItem == null) 
{
    // user has clicked, but not on a TreeViewItem
}

请注意,需要放入
静态
类中。。。如果愿意,您可以随时将其重构为普通方法。

您想要的最终结果UI是什么?换句话说,为什么你只想处理一些点击?您是只希望某些部分是可选择的,还是希望向特定项目添加上下文菜单?那么,在
TreeView
上仅使用
MouseDown
处理程序有什么问题(如果您的操作是针对代码隐藏,则将其作为一种行为)?如果您的
TreeViewItem
处理了单击,则不会调用该事件,如果它们都没有处理该事件,则会调用该事件处理程序,您可以执行所需的操作。安德鲁,有没有办法让某些部分无法选择?我对鼠标事件的工作原理还不太清楚。在冒泡备份之前,程序如何确定previewclick事件将深入到何处?它是点击测试一个位置,然后在视觉树中查找最远的项目,还是在点击测试中有一些索引来告诉顶部是什么?无论如何,我会去阅读命中测试,因为下面的答案似乎引用了这一点
public static T GetParentOfType<T>(this DependencyObject element) where T : DependencyObject
{
    Type type = typeof(T);
    if (element == null) return null;
    DependencyObject parent = VisualTreeHelper.GetParent(element);
    if (parent == null && ((FrameworkElement)element).Parent is DependencyObject) 
parent = ((FrameworkElement)element).Parent;
    if (parent == null) return null;
    else if (parent.GetType() == type || parent.GetType().IsSubclassOf(type)) 
return parent as T;
    return GetParentOfType<T>(parent);
}