【问题标题】:Why does the VisualTreeHelper return a border for a button为什么 VisualTreeHelper 返回按钮的边框
【发布时间】:2015-06-12 14:33:18
【问题描述】:

我正在使用VisualTreeHelper 在一个看起来像这样的按钮上执行HitTest...

<Button Width="100"
    Height="100"
    HorizontalAlignment="Center"
    VerticalAlignment="Center"
    Background="Purple">
    Hello world
</Button>

但是,当我执行实际的 HitTest 时:

HitTestResult result = VisualTreeHelper.HitTest(_ContentHolder, new Point(xTransform, yTransform));
if (result != null)
{               
}

返回的对象看起来像 VisualHit = {System.Windows.Controls.Border} 这对我来说不太有意义。

谁能提供任何指导,说明我可能做错了什么,我将如何返回实际的 Button 对象(这样我可以触发任何事件处理程序)以及为什么我可能会遇到这种行为?

【问题讨论】:

  • 问题:在Button 上使用事件处理程序不是更容易吗?
  • 当然可以,但我试图在不占用实际鼠标的情况下模拟鼠标功能,据我所知,这是我唯一的选择。
  • 你住在什么样的地狱里?
  • 如果你想要特定的元素喜欢按钮,你可以使用 HitTestFilterCallback 来过滤元素。参考msdn.microsoft.com/en-us/library/ms752097(v=vs.110).aspx
  • @MikeEason 哈哈哈哈哈哈。我什至无法开始描述它...如果您有兴趣了解更多信息,请查看此链接msdn.microsoft.com/en-us/library/…,我正在尝试模拟称为 KinectRegion 的东西

标签: c# wpf xaml hittest


【解决方案1】:

如果您查看 Button here 的控件模板,您会发现它几乎完全由 Border 控件组成。由于边界是实际受到打击的地方,这就是归还的东西。您应该使用一个通用的辅助函数来遍历可视化树以找到实际的按钮。

public static T FindParent<T>(DependencyObject child) where T : DependencyObject
{
    //get parent item
    DependencyObject parentObject = VisualTreeHelper.GetParent(child);

    //we've reached the end of the tree
    if (parentObject == null) return null;

    //check if the parent matches the type we're looking for
    T parent = parentObject as T;
    if (parent != null)
        return parent;
    else
        return FindParent<T>(parentObject);
}

调用这个函数,传入命中测试的结果并指定Button作为类型应该返回被点击的父按钮。

现在... 说了这么多,您可能正在尝试以错误的方式做事。如果没有更多关于你在做什么的细节,更重要的是为什么,可能很难指导你。

【讨论】:

  • 非常棒,完全按照要求工作,感谢您的为什么。我怀疑 Button 实际上可能是一个边框,但不确定如何验证。如上所述,我正在尝试模拟鼠标而不实际征用鼠标来创建我自己的 KinectRegion 实现(如此链接中所述msdn.microsoft.com/en-us/library/…) - 衷心感谢您的帮助...
  • 我认为我在 WPF 中写过任何东西都没有调用这个函数至少一次。为什么它不是内置的,我无法理解。
  • 是的,我从 Windows 窗体迁移到 WPF 工作的时间只有几个月,但要让你头脑清醒是相当具有挑战性的。不幸的是,WPF 的许多结构和功能并不总是隐含的显而易见。再次感谢您的帮助,我会尽快标记为答案...
猜你喜欢
  • 2019-11-16
  • 2019-06-25
  • 1970-01-01
  • 2021-03-21
  • 2012-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多