【发布时间】: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(这个