假设我们有两个叠加的矩形r1
和r2
r1.Zindex < r2.Zindex
。
r2.IsHitTestVisible
必须为true
,因为r2
有工具提示,r2
仅在鼠标悬停r1
时可见。
使用默认的WPF命中测试,当鼠标悬停在这些矩形上时,r2
闪烁,因为:
r2
不可见时,r1
是最受欢迎的测试可见元素,因此鼠标已超过r1
,将r2
设置为可见。r2
可见时,r1
不再是最受欢迎的测试可见元素,因此不会认为鼠标位于其上方,反过来隐藏r2
。这是一个具体的例子:
Canvas canvas = new Canvas();
canvas.Width = 500;
canvas.Height = 300;
Rectangle r1 = new Rectangle();
r1.Width = 200;
r1.Height = 100;
r1.Fill = new SolidColorBrush(Colors.Red);
Canvas.SetLeft(r1, 100);
Canvas.SetTop(r1, 100);
canvas.Children.Add(r1);
Rectangle r2 = new Rectangle();
r2.Width = 200;
r2.Height = 100;
r2.Fill = new SolidColorBrush(Colors.Blue);
Canvas.SetLeft(r2, 100);
Canvas.SetTop(r2, 100);
canvas.Children.Add(r2);
r1.IsHitTestVisible = true;
r2.IsHitTestVisible = true;
r2.ToolTip = "r2";
r2.Visibility = Visibility.Hidden;
r1.MouseEnter += (sender, e) => r2.Visibility = Visibility.Visible;
r1.MouseLeave += (sender, e) => r2.Visibility = Visibility.Hidden;
为了避免这种闪烁情况并且能够显示r2
的工具提示,我想修改默认的HitTesting算法,以便:
r2
仍然可以看到命中测试,但遇到时不会停止HitTest研究。r1
保持相同的行为。