我可以让 WPF 为覆盖元素和被覆盖元素设置 IsMouseOver 吗? [英] Can I make WPF set IsMouseOver for both the covering and covered element?

查看:15
本文介绍了我可以让 WPF 为覆盖元素和被覆盖元素设置 IsMouseOver 吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这个简化的例子;描绘由重叠的两个元素 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆