WPF:忽略覆盖/装饰器上的鼠标单击,但处理 MouseEnter 事件

2023-12-30

我真正想要的是忽略鼠标的 IsHitTestVisible 版本click事件但仍然捕获鼠标进入和离开 events.

背景: 每当焦点控件下方都会弹出信息叠加层。这是一项要求,因此我无权删除此行为。这是使用包含矩形形状且填充有图像画笔的装饰器来实现的。所有控件均以编程方式创建,不涉及 XAML。

期望的行为: 当用户将鼠标悬停在矩形上时,它应该变得部分透明。这样他们就可以看到覆盖层下方的其他控件并单击它们。 当用户单击覆盖层时,点击应该传递到覆盖层下的任何控件,就在用户单击的位置。

问题: 如果我设置命中测试是否可见设置为 True 以允许鼠标单击通过,但我没有收到 MouseEnter 事件。

有没有一种简单的方法可以保留 IsHitTestVisible True,然后将除 2-3 个事件之外的所有事件传递给装饰器下方的正确控件?我正在寻找一种不涉及计算光标下方的控件的解决方案,因为 WPF 显然能够为我执行此操作。

或者,我可以将 IsHitTestVisible 设置为 False 但然后使用另一种简单的方法来确定鼠标何时位于装饰器上?

UPDATE:我仍然希望得到答案,但到目前为止,最有希望的解决方案似乎是让 IsHitTestVisible 为 true,并使用 WPF 命中测试 API 来确定鼠标光标下方的控件类型;如果这是我知道的,我会向它发送一个 Click 命令。但不确定这是否值得做;截至目前,单击会消除我的叠加层,因此用户只需单击两次即可。

Thanks!


由于 IsHitTestVisible="False" 禁用所有鼠标交互,因此这似乎不是任何干净的方法。我试过

  • 在 OnPreviewMouseDown 中设置 IsHitTestVisible="False" ,然后使用 UIAutomation 重新单击装饰器,但没有骰子
  • 将不透明度绑定到装饰器下的“不可见”元素,以便单击可以通过。它顺利地通过了,但是当然问题在下一个级别是相同的,所以没有骰子。

似乎真正让它起作用的唯一方法是在 OnMouseDown 中设置 IsHitTestVisible=“False”,然后使用 SendInput 模拟新的 MouseClick。不是很漂亮,但它可以完成工作。

protected override void OnMouseDown(MouseButtonEventArgs e)
{
    IsHitTestVisible = false;

    Action action = () =>
    {
        MouseSimulator.ClickLeftMouseButton();
        IsHitTestVisible = true;
    };
    this.Dispatcher.BeginInvoke(action, DispatcherPriority.ContextIdle); 
}

public class MouseSimulator
{
    [DllImport("user32.dll", SetLastError = true)]
    static extern uint SendInput(uint nInputs, ref INPUT pInputs, int cbSize);

    [StructLayout(LayoutKind.Sequential)]
    struct INPUT
    {
        public SendInputEventType type;
        public MouseKeybdhardwareInputUnion mkhi;
    }
    [StructLayout(LayoutKind.Explicit)]
    struct MouseKeybdhardwareInputUnion
    {
        [FieldOffset(0)]
        public MouseInputData mi;

        [FieldOffset(0)]
        public KEYBDINPUT ki;

        [FieldOffset(0)]
        public HARDWAREINPUT hi;
    }
    [StructLayout(LayoutKind.Sequential)]
    struct KEYBDINPUT
    {
        public ushort wVk;
        public ushort wScan;
        public uint dwFlags;
        public uint time;
        public IntPtr dwExtraInfo;
    }
    [StructLayout(LayoutKind.Sequential)]
    struct HARDWAREINPUT
    {
        public int uMsg;
        public short wParamL;
        public short wParamH;
    }
    struct MouseInputData
    {
        public int dx;
        public int dy;
        public uint mouseData;
        public MouseEventFlags dwFlags;
        public uint time;
        public IntPtr dwExtraInfo;
    }
    [Flags]
    enum MouseEventFlags : uint
    {
        MOUSEEVENTF_MOVE = 0x0001,
        MOUSEEVENTF_LEFTDOWN = 0x0002,
        MOUSEEVENTF_LEFTUP = 0x0004,
        MOUSEEVENTF_RIGHTDOWN = 0x0008,
        MOUSEEVENTF_RIGHTUP = 0x0010,
        MOUSEEVENTF_MIDDLEDOWN = 0x0020,
        MOUSEEVENTF_MIDDLEUP = 0x0040,
        MOUSEEVENTF_XDOWN = 0x0080,
        MOUSEEVENTF_XUP = 0x0100,
        MOUSEEVENTF_WHEEL = 0x0800,
        MOUSEEVENTF_VIRTUALDESK = 0x4000,
        MOUSEEVENTF_ABSOLUTE = 0x8000
    }
    enum SendInputEventType : int
    {
        InputMouse,
        InputKeyboard,
        InputHardware
    }

    public static void ClickLeftMouseButton()
    {
        INPUT mouseDownInput = new INPUT();
        mouseDownInput.type = SendInputEventType.InputMouse;
        mouseDownInput.mkhi.mi.dwFlags = MouseEventFlags.MOUSEEVENTF_LEFTDOWN;
        SendInput(1, ref mouseDownInput, Marshal.SizeOf(new INPUT()));

        INPUT mouseUpInput = new INPUT();
        mouseUpInput.type = SendInputEventType.InputMouse;
        mouseUpInput.mkhi.mi.dwFlags = MouseEventFlags.MOUSEEVENTF_LEFTUP;
        SendInput(1, ref mouseUpInput, Marshal.SizeOf(new INPUT()));
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WPF:忽略覆盖/装饰器上的鼠标单击,但处理 MouseEnter 事件 的相关文章

随机推荐

  • pyinstaller 2.0 - 如何为 Windows exe 文件添加描述?

    如何向单个文件 exe 添加版本 版权 文件描述等描述 python pyinstaller py F w i favicon ico C Projekte Eclipse MyApp app pyw version file 版本信息 t
  • 如何忽略 Jacoco 的 lombok.@UtilityClass?

    我用过lombok UtilityClass to 生成私有构造函数 使班级最终 将实用程序类中的所有字段设为静态 并且 Jacoco 不涵盖 Lombok 生成的代码 如果我显式定义一个私有构造函数 Jacoco 可以识别它 因此 有任何
  • MSMPI 就地 MPI_Allreduce 不适用于 MinGW-w64 gfortran

    我正在尝试使用就地MPI Allreduce结合MinGW w64 gfortran MSYS64提供的版本9 2 和Microsoft MPI 版本10 call MPI Allreduce MPI IN PLACE srcdst n M
  • 如果我在开发代码中使用 Smart::Comments 应该注意什么?

    我知道 Smart Comments 不应在生产代码中使用 因为它是源过滤器 然而 我一直在使用Smart Comments http search cpan org perldoc Smart Comments在我的开发代码中 然后在将代
  • 我们什么时候需要 IOptions?

    我正在 Net Core 中学习 DI 但我不知道使用 DI 的好处IOptions 为什么我们需要IOptions如果我们可以没有它吗 With IOptions interface IService void Print string
  • TypeORM 上传和服务(下载)文件

    介绍 在我的项目中 我尝试将文件存储在 MySQL 中 用户可以上传文件 html WEB APP 之后用户就有了上传文件的列表 html WEB APP 用户可以通过Link下载文件 在后端 我使用一个node js TypeORM 项目
  • 页面操作和浏览器操作有什么区别?

    我做了一个浏览器操作 但我只是尝试测试页面操作 按钮放置在同一位置 但页面操作按钮无法单击 图标呈灰色 我认为页面操作按钮位于地址栏上 而不是工具栏中 为什么它位于同一个地方 My browser action button My page
  • 合并不同目录级别的 git 存储库

    我有一个存储库 B 其内容需要驻留在 A src B 中 A 的子目录中 我希望最终得到一个存储库 A 其中包含 A 和 B 的提交历史记录 网络上的其他解决方案似乎向我展示了如何在单独的子树中保持树完整 或合并具有相同目录结构的存储库的选
  • 在 Pandas 数据帧上使用 groupby 按财政年度进行分组

    我有一个数据框 with a 日期时间64称为 DT 的列 是否可以使用groupby按财政年度从4月1日到3月31日进行分组 例如 Date PE LOW 2010 04 01 15 44 2011 03 31 16 8 2011 04
  • 下载 Excel 文件

    我之前曾问过这个问题 但在启动文件下载时仍然遇到困难 var fileName ExcelData xlsx var file new FileInfo fileName using var package new OfficeOpenXm
  • 撤销权限 android.permission.CAMERA

    我收到错误revoked permission android permission CAMERA 我在清单上使用了相机权限 private void dispatchTakePictureIntent int actionCode Int
  • 程序崩溃,但调试诊断说这是第一次机会异常,对吗?

    也许这是正常情况 但我很困惑 我正在从 Visual Studio 运行我的 C 调试应用程序 DebugDiag 设置为自动附加到进程 我有一条规则从该 应用程序收集故障转储 并且该规则定义未配置的第一次机会异常的操作应为 无 但是当应用
  • 如何将 EL 变量传递给 JavaScript

    我有一个变量 bean name 我如何将它传递给 JavaScript 变量 我试过了var name bean name and var name bean name 但它不起作用 我的想法是将其放入隐藏输入中 就像隐藏中一样
  • Phonegap iOS:将图像下载到照片库

    是否可以下载文件 图像 并将其保存在照片库中 我知道这一点download http docs phonegap com en 2 3 0 cordova file file md html FileTransfer download方法
  • 获取整数的第 n 位

    我得到一个大整数a 和一个 相对较小的 整数n 最快的获取方式是什么n二进制表示的第 th 位 从右起 a使用原生Python 将位移到最后一个位置 屏蔽其他所有内容 bit a gt gt n 1 这假设这些位以通常的方式索引 即最低有效
  • 如何在 asp.net MVC 中压缩内容?

    如何压缩 asp net mvc 应用程序发送的输出 这是我使用的 截至目前 using System IO Compression public class CompressAttribute ActionFilterAttribute
  • 从 kpcs7 (.p7b) 文件中提取私钥和证书

    我有一个 p7b 文件 如何提取密钥和证书 我尝试过 openssl 但无法获得确切的命令 选项 Thanks PKCS 7 文件不包含私钥 至于证书 您尚未指定您使用的平台以及您的问题与编程有何关系
  • 在 Windows 上安装更新时 Electron 自动更新失败

    我有一个电子应用程序 它使用electron builder用于构建 打包和发布应用程序 我有以下自动更新代码 autoUpdater logger log autoUpdater logger transports file level
  • VBScript 打开一个对话框来选择文件路径

    目前我正在使用 vbscript 打开一个文件 如下所示 strFile C Users test file txt Set objFile objFSO OpenTextFile strFile 我想更改此设置 以便用户可以选择 导航到文
  • WPF:忽略覆盖/装饰器上的鼠标单击,但处理 MouseEnter 事件

    我真正想要的是忽略鼠标的 IsHitTestVisible 版本click事件但仍然捕获鼠标进入和离开 events 背景 每当焦点控件下方都会弹出信息叠加层 这是一项要求 因此我无权删除此行为 这是使用包含矩形形状且填充有图像画笔的装饰器