WPF TreeView, получить TreeViewItem в событии PreviewMouseDown

Как я могу определить TreeViewItem нажал в событии PreviewMouseDown?

2 ответа

Кажется, работает следующее:

private void myTreeView_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
  TreeViewItem item = GetTreeViewItemClicked((FrameworkElement)e.OriginalSource, 
                                                                       myTreeView);
  ...
}

private TreeViewItem GetTreeViewItemClicked(FrameworkElement sender, TreeView treeView)
{
  Point p = ((sender as FrameworkElement)).TranslatePoint(new Point(0, 0), treeView);
  DependencyObject obj = treeView.InputHitTest(p) as DependencyObject;
  while (obj != null && !(obj is TreeViewItem))
    obj = VisualTreeHelper.GetParent(obj);
  return obj as TreeViewItem;
}

Первоначально я использовал метод расширения в TreeView, который принимает UIElement - отправителя события PreviewMouseDown - как это:

private void MyTreeView_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
    var uiElement = sender as UIElement;
    var treeViewItem = myTreeView.TreeViewItemFromChild(uiElement);
}

Вот метод расширения (он проверяет самого ребенка в случае, если вы нажали прямо на TreeViewItem напрямую)...

public static TreeViewItem TreeViewItemFromChild(this TreeView treeView, UIElement child)
{
    UIElement proposedElement = child;

    while ((proposedElement != null) && !(proposedElement is TreeViewItem))
        proposedElement = VisualTreeHelper.GetParent(proposedElement) as UIElement;

    return proposedElement as TreeViewItem;
}

Обновить:

Однако с тех пор я перешел на более общую версию, которую я могу использовать где угодно.

public static TAncestor FindAncestor<TAncestor>(this UIElement uiElement)
{
    while ((uiElement != null) && !(uiElement is TAncestor))
        retVal = VisualTreeHelper.GetParent(uiElement) as UIElement;

    return uiElement as TAncestor;
}

Он либо находит искомый тип (опять же, включая саму проверку), либо возвращает ноль

Вы бы использовали его в том же обработчике PreviewMouseDown, как так...

private void MyTreeView_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
    var uiElement = sender as UIElement;
    var treeViewItem = uiElement.FindAncestor<TreeViewItem>();
}

Это очень удобно, когда мой TreeViewItem имеет CheckBox в своем шаблоне, и я хотел выбрать элемент, когда пользователь установил флажок, который обычно глотает событие.

Надеюсь это поможет!

Другие вопросы по тегам