【问题标题】:Why would my HitTestResultCallback not be called为什么我的 HitTestResultCallback 不会被调用
【发布时间】:2021-06-21 14:21:34
【问题描述】:

我继承了一个程序,该程序使用命中测试来针对画布上的一堆绘图处理鼠标事件。在某些情况下,我的 HitTestResultCallBack 会停止调用。

这里是 HitTest 被调用的地方(这是从 mousemove 事件中调用的):-

internal void HitTest(System.Windows.Input.MouseEventArgs e)
{
    m_visualTrackerHit = m_visualTrackerHit2 = null;
    Point location = e.GetPosition(this);
    Geometry g = new RectangleGeometry(new Rect(location.X - m_connectDistance, location.Y - m_connectDistance, m_connectDistanceX2, m_connectDistanceX2));
    HitTestParameters parameters = new GeometryHitTestParameters(g);
    HitTestResultCallback callback = new HitTestResultCallback(this.HitTestCallback);
    System.Diagnostics.Debug.Print("About to Hit Test");
    VisualTreeHelper.HitTest(this, null, callback, parameters);
}

这是我的回调函数:-

private HitTestResultBehavior HitTestCallback(HitTestResult result)
{
    System.Diagnostics.Debug.Print("HitTestCallBack");
    DrawingVisual visual = result.VisualHit as DrawingVisual;
    if (visual != null)
    {
        VisualTracker visualTracker = visual.GetValue(FrameworkElement.TagProperty) as VisualTracker;
        if (visualTracker != null && visualTracker.Type != VisualType.Selection && visualTracker.Type != VisualType.Ignore)
        {
            if (m_visualTrackerHit == null || visualTracker.Type < m_visualTrackerHit.Type)
            {
                m_visualTrackerHit = visualTracker;
            }
        }
    }
    return HitTestResultBehavior.Continue;
}

在我采取特定的、明显不相关的行动之前,这一切都很好。 (在这种情况下,每张图都代表一个具有各种属性的“组件”。将属性设置为无效值会导致问题,但这都是域内容,几乎可以肯定与我的问题无关)。一旦采取该操作,回调方法就会停止被调用。注意不仅对于属性被更改的绘图,回调停止为画布及其上的所有对象调用。

我已经跟踪了动作的代码路径,看不到任何明显的东西,但它非常复杂,我很可能错过了一些东西,所以我想从另一个方向来。回调不会被调用的可能原因是什么。

我已经检查了以下内容:-

使用正确的值定义了 RectangleGeometry,因此它应该指示与绘图的冲突

在任何地方都没有将 IsHitTestVisible 设置为 false。

有什么建议吗?

【问题讨论】:

  • mousemove 是否仍然订阅并触发,“即将命中测试”仍在输出?
  • 是的。 HitTest 正在触发,但 HitTestCallBack 未触发。
  • 也许“this”不是被击中的父级。 VisualTreeHelper.HitTest(这个

标签: c# wpf hittest


【解决方案1】:

我想回到这个问题,因为我终于找到了答案——或者至少是其中的一部分。在组件上设置为无效值的属性导致该组件的绘制方法中出现除以零错误。这意味着组件没有重绘,但它的旧图保留在原处,这意味着发生错误并不明显。

我已经对此进行了一些测试,并且任何未处理的错误绘制到画布似乎会导致该画布上的任何内容不再调用 hitTestCallback。我不知道为什么会这样,但此时我很容易解决,因为我可以防止除以零异常

【讨论】:

    【解决方案2】:

    使用Snoop 调试您的程序:

    1. 确定工作案例的事件路径
    2. 确定非工作案例的事件路径
    3. 一旦查明原因,您就可以提出解决办法

    【讨论】:

    • 谢谢。这看起来正是我所追求的那种东西。试一试,并将回复任何发现。
    猜你喜欢
    • 1970-01-01
    • 2011-11-26
    • 2013-07-22
    • 2018-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多