LogicalTree Control直接在鼠标下没有VisualTree

时间:2013-03-06 20:25:04

标签: wpf mouse mousedown visualtreehelper frameworkelement

这是一个WPF应用程序。

我正试图直接在鼠标下控制它,这被证明是一种令人惊讶的痛苦。

Mouse.DirectlyOver,InputHitTest和VisualTreeHelper.HitTest都引用了VISUAL树。我正试图抓住控制器。

示例:如果我有一个TextBox并使用上述任何一个,它将返回一个TextBoxView,而我想要TextBox本身。

这发生在PreviewLeftButtonDown事件中。发件人不是一个选项,因为Sender始终是我的ListViewItem。如果我检查e.OriginalSource,它仍然是VisualTree元素而不是实际控件。

如果需要,很高兴进一步解释。

由于

3 个答案:

答案 0 :(得分:4)

您只需沿着可视树走,直到找到所需的类型。这是一些代码的link

以下是该链接的代码

// walk up the visual tree to find object of type T, starting from initial object
public static T FindUpVisualTree<T>(DependencyObject initial) where T : DependencyObject
{
    DependencyObject current = initial;

    while (current != null && current.GetType() != typeof(T))
    {
         current = VisualTreeHelper.GetParent(current);
    }
    return current as T;   
}

答案 1 :(得分:1)

走上可视树,直到找到UIElement

public UIElement FindUIElement(DependencyObject visualTreeNode)
{
    UIElement elem;
    while ((elem = (visualTreeNode as UIElement)) != null)
        visualTreeNode = VisualTreeHelper.GetParent(visualTreeNode);
    return elem;
}

答案 2 :(得分:1)

我同意mdm20,到达Textbox的唯一方法是遍历父母。事实上,here is a link to the same question asked a couple of years ago,答案相同。如果你想限制不必要的树遍历,那么你可以在点击ListViewItem后停止搜索,因为任何高于该点的东西都不是你想要的。

但是,添加最后一个链接和this one together,我觉得你已经有了答案。如果返回TextBoxView,那么您就知道文本框已被点击。您甚至可以缓存潜在地通过TextBox的传入HitTestFilterCallBack,但这更像是一种理论,可能容易出错。但是,沿着这条路走下去,您可以测试通过过滤器的TextBox是否是TextBoxView的父级