如何通过 WPF 中的 HitTesting 使用坐标/点获取 TreeViewItem?

Joa*_*nge 3 .net c# wpf treeview

我正在尝试TreeViewItem将鼠标放在鼠标下方,但找不到方法。

目前我正在使用这个:

Layer GetItemAtLocation ( Point point )
{
    HitTestResult result = VisualTreeHelper.HitTest ( this, point );
    FrameworkElement element = result.VisualHit as FrameworkElement;
    if ( element != null )
        return element.DataContext as Layer;

    return null;
}
Run Code Online (Sandbox Code Playgroud)

此方法很有用,但不会导致TreeViewItem鼠标下方。

关于如何做到这一点的任何想法?

Liz*_*Liz 5

你没有具体说明是什么导致你需要这个,这会有所帮助。

这有点讨厌,但你可以这样做:

IInputElement dropNode = tree.InputHitTest(point);
Run Code Online (Sandbox Code Playgroud)

这可能会给您一个 TextBlock,因此您必须使用 VisualTreeHelper.GetParent() 向上导航 TextBlock、ContentPresenter、Border、Grid,然后最终导航到 TreeViewItem。

这当然不是最好的方法,但它应该有效。

根据您在做什么,Mike Hillberg 的博客提供了一个在触发器中使用的附加属性方法。看这里

在他的示例中,当鼠标悬停在 TreeViewItem 上方时,他将其变为绿色。

<TreeView.Resources>
      <Style TargetType="TreeViewItem">
        <Style.Triggers>
          <Trigger Property="local:MyTreeViewHelper.IsMouseDirectlyOverItem" Value="True">
            <Setter Property="Background" Value="Green" />
          </Trigger>
        </Style.Triggers>
      </Style>
    </TreeView.Resources>
Run Code Online (Sandbox Code Playgroud)

MyTreeViewHelper 类跟踪 MouseEnter/MouseLeave 事件,并提供了一个很好的属性,可以在触发器和事物中使用,就像上面的那个。

我希望这有帮助。