这是一个WPF应用程序。
我正试图直接在鼠标下控制它,这被证明是一种令人惊讶的痛苦。
Mouse.DirectlyOver,InputHitTest和VisualTreeHelper.HitTest都引用了VISUAL树。我正试图抓住控制器。
示例:如果我有一个TextBox并使用上述任何一个,它将返回一个TextBoxView,而我想要TextBox本身。
这发生在PreviewLeftButtonDown事件中。发件人不是一个选项,因为Sender始终是我的ListViewItem。如果我检查e.OriginalSource,它仍然是VisualTree元素而不是实际控件。
如果需要,很高兴进一步解释。
由于
答案 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
的父级