我可以让 WPF 为覆盖元素和被覆盖元素设置 IsMouseOver 吗? [英] Can I make WPF set IsMouseOver for both the covering and covered element?
问题描述
这个简化的例子;描绘由重叠的两个元素 A 和 B 组成的维恩图.如果我将鼠标悬停在 (A AND (NOT B)) 上,所有 A 都会亮起.如果我将鼠标悬停在 (B AND (NOT A)) 上,所有 B 都会亮起.如果我将鼠标悬停在(A 和 B)上,两者都应该亮起.只有最顶部被标记为鼠标悬停.
The simplified example this; picture a Venn diagram made from two elements, A and B, that overlap. If I mouse over (A AND (NOT B)) all of A lights up. If I mouse over (B AND (NOT A)) all of B lights up. If I mouse over (A AND B), BOTH should light up. Only the top most is marked as having the mouse over it.
有没有办法让 IsMouseOver 像这样进行隧道传输?如果没有,有什么建议吗?
Is there a way to allow IsMouseOver to tunnel like this? If not, any suggestions?
推荐答案
您可以使用 VisualTreeHelper 进行手动命中测试.这可以进入某个父对象上的 MouseMove 处理程序.这里我假设有一个由名为 RedCircle 和 BlueCircle 的椭圆组成的维恩图:
You can do manual hit testing using VisualTreeHelper. This can go into a MouseMove handler on some parent object. Here I'm assuming a Venn diagram made of ellipses named RedCircle and BlueCircle:
bool overRed = false;
bool overBlue = false;
if (BlueCircle.IsMouseOver || RedCircle.IsMouseOver)
{
HitTestParameters parameters = new PointHitTestParameters(e.GetPosition(RedCircle));
VisualTreeHelper.HitTest(RedCircle, new HitTestFilterCallback(element => HitTestFilterBehavior.Continue), result =>
{
if (result.VisualHit == RedCircle)
overRed = true;
return HitTestResultBehavior.Continue;
}, parameters);
parameters = new PointHitTestParameters(e.GetPosition(BlueCircle));
VisualTreeHelper.HitTest(BlueCircle, new HitTestFilterCallback(element => HitTestFilterBehavior.Continue), result =>
{
if (result.VisualHit == BlueCircle)
overBlue = true;
return HitTestResultBehavior.Continue;
}, parameters);
}
这篇关于我可以让 WPF 为覆盖元素和被覆盖元素设置 IsMouseOver 吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!