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

时间:2011-04-21 22:23:10

标签: c# .net 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;
}

此方法很有用,但不会在鼠标下显示TreeViewItem

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

1 个答案:

答案 0 :(得分:4)

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

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

IInputElement dropNode = tree.InputHitTest(point);

这可能会给你一个TextBlock,所以你必须使用VisualTreeHelper.GetParent()来向上浏览TextBlock,ContentPresenter,Border,Grid,最后是TreeViewItem。

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

根据您的工作情况,Mike Hillberg的博客提供了一种用于触发器的附加属性方法。见here

在他的例子中,当鼠标悬停在它上面时,他正在将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>

MyTreeViewHelper类跟踪MouseEnter / MouseLeave事件,并提供一个可用于触发器和事物的很好的属性,如上所述。

我希望有所帮助。