当鼠标实际移动到元素上时如何获取 MouseMove 事件

2024-01-30

基本上我想要做的是将自定义窗口的状态从最大化更改为正常状态,并调整窗口的位置,当用户单击标题栏并将鼠标移动到标题栏上时,在我的情况下,标题栏是一个简单的边框。

显而易见的事情是将事件处理程序附加到MouseMove并检查鼠标左键是否被按下:

    private void OnMouseMove(object sender, MouseEventArgs e)
    {
        if (e.LeftButton == MouseButtonState.Pressed)
        {
            Console.WriteLine("Mouse moved" + Mouse.Captured);
        }
    }

问题是MouseMove当鼠标捕获发生变化时发生。所以在我的应用程序中,窗口将捕捉到Normal打开弹出窗口并单击边框后的状态,捕捉应该在开始拖动后发生。

下面是上述代码的 XAML 来证明问题:

 <Grid MouseMove="OnMouseMove" Background="AliceBlue">
    <ComboBox Height="23">
        <ComboBoxItem>Test1</ComboBoxItem>
        <ComboBoxItem>Test1</ComboBoxItem>
        <ComboBoxItem>Test1</ComboBoxItem>
        <ComboBoxItem>Test1</ComboBoxItem>
        <ComboBoxItem>Test1</ComboBoxItem>
        <ComboBoxItem>Test1</ComboBoxItem>
    </ComboBox>
</Grid>

问题步骤,在debug中运行上面的代码:

  1. 点击ComboBox打开其弹出窗口。
  2. 单击蓝色网格(这将关闭弹出窗口)。

Notice:输出窗口显示消息“鼠标已移动”

预期行为:由于只进行了单击(没有鼠标移动),我不想要MouseMove event.

据我了解,MouseMove被解雇时Mouse.Captured元素发生变化,这是正常的,但我需要一种方法来区分正常的MouseMove and a MouseMove由鼠标捕获引起。

EDIT:

有关此问题的更复杂的示例可以在 MahApps.Metro 演示中找到。步骤与上述相同 - 当窗口处于最大化状态时,打开一个弹出窗口并单击标题栏。您会注意到窗口从最大化状态突然变为正常状态。这不应该发生,因为您没有双击或拖动标题栏。

到目前为止我的解决方案:

因为我知道这是由鼠标捕获的元素更改引起的,所以我处理了LostMouseCapture事件并保存鼠标位置:

    private Point mousePositionAfterCapture;

    private void OnLostMouseCapture(object sender, MouseEventArgs e)
    {
        mousePositionAfterCapture = e.GetPosition(this);
    }   

And in MouseMove处理程序我检查上次丢失鼠标捕获后位置是否已更改:

private void OnMouseMove(object sender, MouseEventArgs e)
{
    if (e.LeftButton == MouseButtonState.Pressed)
    {
        Point currentPossition = e.GetPosition(this);

        if (currentPossition == mousePositionAfterCapture)
            //means that the MouseMove event occurred as a result of 
            //Mouse Captured element change, we wait until an actual
            //mouse move will occure
            return;         

        Console.WriteLine("Mouse moved" + Mouse.Captured);
    }
}

当我了解更多有关拖动的知识后,我将自己回答这个问题。拖动是一项应在鼠标移动且按下鼠标左键时启动的操作,但不应立即启动,以防止意外启动SystemParameters.MinimumHorizontalDragDistance and SystemParameters.MinimumVerticalDragDistance应使用静态成员。

private Point startPoint;

private void OnPreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    startPoint = e.GetPosition(null);
}  

private void OnPreviewMouseMove(object sender, MouseEventArgs e)
{
    if (e.LeftButton == MouseButtonState.Pressed)
    {
        Point position = e.GetPosition(this);

        if (Math.Abs(position.X - startPoint.X) > SystemParameters.MinimumHorizontalDragDistance ||
            Math.Abs(position.Y - startPoint.Y) > SystemParameters.MinimumVerticalDragDistance)
           {
               StartDrag(e);
           }
    }
}

这解决了这个问题中提出的问题,因为如果鼠标没有改变其位置,拖动将永远不会开始。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当鼠标实际移动到元素上时如何获取 MouseMove 事件 的相关文章

随机推荐

  • WebDriverException:未知错误:Runtime.executionContextCreated 具有无效的“上下文”:初始化 Chrome 浏览器时

    我正在尝试开始使用 selenium 并下载了 chrome 驱动程序并将其放入我的类路径中 我现在只是想获得标题 看看是否可以让它发挥作用 目前代码如下所示 import org openqa selenium WebDriver imp
  • 动态模块什么时候会出现类型加载异常?

    我有一个动态模块 当我的应用程序运行时 它会添加类型 该模块是通过以下代码创建的 var assemblyName new AssemblyName MyAssembly var assemblyBuilder AppDomain Curr
  • 如何在 check 子句中使用 CURDATE()?

    我尝试创建一个表 其中 dateFrom 和 dateTo 字段需要高于今天的日期 所以我这样使用 CHECK CREATE TABLE Booking hotelNo int 10 guestNo int 10 dateFrom date
  • Python,使用多处理进一步加速 cython 函数

    此处显示的代码经过简化 但会触发相同的 PicklingError 我知道关于什么可以腌制和什么不能腌制有很多讨论 但我确实从他们那里找到了解决方案 我编写了一个简单的 cython 脚本 具有以下功能 def pow2 int a ret
  • 如何在xlwings中选择整个工作表

    我在用xlwings 我想复制整个wb1 sheets 1 并粘贴到wb sheets 1 A4细胞 目前我必须设置一个非常大的单元格Z100000 有没有通用的方法来选择整个工作表而不是不安全区域A1 Z10000 import xlwi
  • 使用 AES256 和 Node.js 解密长度超过 15 个字符的输入数据时出错

    我正在使用 Node js 的加密模块和 AES 256 CBC 密码算法编写自己的安全类 但是 当我尝试解密从长度超过 15 个字符的输入数据加密的加密字符串时 失败并出现以下错误 crypto js 153 var ret this h
  • 了解自制程序和仅小桶的依赖关系

    我最近开始使用自制软件 我对当我在我的系统上酿造某些东西时会发生什么感到有点困惑 但它的酿造依赖项是仅桶的 这意味着它们链接在 usr local 例如 我正在安装vips 图像处理库 它的众多依赖项之一是 pixman Pixman 仅作
  • 流程图 x 轴时间问题... AARGHHH

    我很难将数据显示在以 x 轴作为时间线的流程图中 这是我的 JSON 文件的缩写副本 label ServiceReport data 1328983200 53 1328986800 53 1328990400 60 我已按照 Flot
  • Vue 路由器可以在开发服务器上运行,但不能在 vercel vite 上运行

    我正在使用 vite 制作一个项目 该项目使用 vue router 4 它工作得很好 但是当查看 vercel 或 netlify 上的链接时 我收到 404 错误 这是我的 index js 文件 路由器设置 import create
  • group_by 返回重复的键

    Python 3 6 我有一个简单的对象列表 for obj in obj ts print obj address 这告诉我 mwpJCSEEkphA1utQGA2Y9Vx8cufv85CgpR mwpJCSEEkphA1utQGA2Y9
  • JFreeChart:如何使系列不可见?

    我正在尝试使 ohlc 柱形图不可见 以便我可以仅保留移动平均线的窗口 这是两个系列 ohlc 柱和移动平均线 的代码 private static JFreeChart createChart OHLCDataset dataset JF
  • 不同的背景图像和左面板错误

    我使用的是 jQuery mobile 1 4 如果单击左侧面板 我的背景就会消失 我在奥马尔的帮助下解决了这个错误 非常感谢 Aim 主页应该有深色背景 所有其他页面应该有浅色背景 问题一 如果我单击主页上的面板 它就会起作用 如果我转到
  • 如何在React中使用animejs?

    我已经从 npm 安装了animejs 并导入了所需的文件 但是当在我的代码中添加anime code 时 它无法正常工作并显示错误 这是我所做的一个小例子 import React from react import anime from
  • Python message.content 不和谐机器人

    我正在努力让我的discord py当有人发送一些单词时 机器人会自动响应 但问题是该命令仅在该单词是句子中首先写入的情况下才有效 我希望我的机器人能够响应该消息 即使该单词位于某个句子的中间 如果这是可能的 我该怎么做 以下示例将执行您想
  • iOS 支持哪些字体格式?

    我想知道iOS支持哪些字体格式 我已经知道iOS支持TTF格式 它是否支持任何其他功能 例如 PFM 或 PMB 从 iOS 7 开始 支持 TTF 和 OTF 字体格式 您可以在应用程序中或通过配置文件分发这些字体 以使它们在系统范围内可
  • 如何将 boost::bind 与不可复制的参数一起使用,例如 boost::promise?

    某些 C 对象没有复制构造函数 但有移动构造函数 例如 boost promise 如何使用它们的移动构造函数绑定这些对象 include
  • 大地图寻路

    我正在创建一个带有 10 000 x 10 000 地图的游戏 我希望用户能够设置位置并让计算机立即找到最佳路径 然而 由于地图是10 000 x 10 000 有100 000 000个节点 并且通过诸如A 或Dijkstra之类的传统方
  • SQL GROUP_CONCAT 拆分为不同的列

    我进行了很多搜索 但没有找到解决我的问题的正确方法 我想做什么 我在 MySQL 中有 2 个表 国家 货币 我通过 CountryCurrency 将它们加入到一起 gt 由于多对多的关系 请参阅此示例 http sqlfiddle co
  • 将 cython cdef 扩展数组设置为零

    有没有一种 cython ic 方式来设置cdef数组归零 我有一个具有以下签名的函数 cdef cget values double cpc x double cpc y 该函数的调用方式如下 cdef double cpc x 16 c
  • 当鼠标实际移动到元素上时如何获取 MouseMove 事件

    基本上我想要做的是将自定义窗口的状态从最大化更改为正常状态 并调整窗口的位置 当用户单击标题栏并将鼠标移动到标题栏上时 在我的情况下 标题栏是一个简单的边框 显而易见的事情是将事件处理程序附加到MouseMove并检查鼠标左键是否被按下 p