WPF TreeView, получить TreeViewItem в событии PreviewMouseDown - PullRequest
3 голосов
/ 31 мая 2010

Как определить, что TreeViewItem щелкнул в событии PreviewMouseDown?

Ответы [ 2 ]

8 голосов
/ 31 мая 2010

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

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;
}
2 голосов
/ 15 октября 2010

Первоначально я использовал метод расширения в 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 в своем шаблоне, и я хотел выбрать элемент, когда пользователь установил флажок, который обычно глотает событие.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...