c# - 垂直滑动模拟鼠标事件发送到 Windows 10 平板电脑上的 Windows 窗体应用程序中的错误控件

标签 c# winforms scroll touch windows-10

我正在尝试在 Windows 10 平板电脑 (Dell Venue 8 Pro) 上运行 Windows 窗体应用程序。通常,Windows 将触摸事件转换为明显的鼠标事件对应物。但是,它在垂直滑动时做了一些奇怪的事情。

我的应用程序有一个显示图形的自定义控件(直接从 Control 派生,在其构造函数中调用 SetStyle(ControlStyles.Selectable..., true))由 Direct3D 渲染。该控件将 MouseDown -> MouseMove -> MouseUp 序列解释为围绕观察位置旋转 View 的请求。这在台式机上工作正常,但在平板电脑上它坏了:我的自定义控件上的垂直滑动不知何故被 Windows 捕获并传递到附近的 DataGridView,在那里它们被解释为滚动浏览的请求 table 。 DataGridView 和我的控件不是同一容器下的兄弟;它们处于控制层次结构的完全不同级别。这是一个屏幕截图:

Screenshot of the application showing the different interpretations of vertical and horizontal swipes

我已经进行了一些调试,以向自己证明在垂直滑动期间没有鼠标事件进入我的控制范围。当我抬起手指时,有一些滴入右侧,但在垂直滑动期间什么也没有。

问题似乎是我的代码(在事件处理程序中)根本没有运行,因为没有输入进入我的控制。

这里发生了什么,有什么方法可以告诉 Windows 不要将在我的控件上发生的垂直滑动事件发送到完全不相关的控件?

编辑:我应该补充一点,我在我的代码中到处调用 Focus() 以确保当鼠标悬停在我的控件上时我的控件获得焦点.我将它放在 OnMouseMoveOnMouseDown 以及几乎所有其他鼠标事件中。

编辑:我构建了一个small Visual Studio 2010 solution证明这个问题。此处内联重现的代码太多,但很容易理解。构建它,将其安装在 Windows 10 平板电脑上,然后尝试在最右侧的控件中垂直滑动。请注意,DataGridView 不是该控件接收大量鼠标事件,而是触发 Scroll

更新:我已经明确测试了当 DataGridView 获得 Scroll 事件时我的控件是否获得焦点。如果我在我的控件上调用 Focus() 以响应 MouseMove 等,如上所述,我的控件确实获得焦点并在 的垂直滑动期间保持它DataGridView.Scroll 正在触发。在 DataGridView.Scroll 事件处理程序中,我已经打印出我的控件是否获得焦点,事实确实如此。所以这不是 DataGridView 窃取焦点的问题;这是 DataGridView 为我的控件处理滑动的问题,即使我的控件处于焦点状态也是如此。

注意:如果我将 dataGridView.ScrollBars 设置为 ScrollBars.None,滑动的鼠标事件将由我控制。我一直在搞乱丑陋的黑客,每次我的控件获得焦点时隐藏滚动条,并在每次 DataGridView 获得焦点时显示它们。但它们都是丑陋的 hack,具有令人不快的副作用。

最佳答案

如何自己处理触摸事件,而不是等待 Microsoft 自己的正确实现。 link

关于c# - 垂直滑动模拟鼠标事件发送到 Windows 10 平板电脑上的 Windows 窗体应用程序中的错误控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33744331/

相关文章:

c# - 从 Controller 方法获取数组,将其传递给 Javascript/JQuery

ios - UITextField 成为第一响应者后,UITableView 不会调整大小

javascript - 用动画滚动到中心

c# - 将输入值保存在二维数组中

c# - 调整控件大小时 Winforms 自动滚动丢失

c# - Kinect 和 Unity3D : Mapping Kinect Joints with 3D model

c# - Windows 10 移动版上的初始屏幕状态栏颜色

c# - 无法在 ASP.NET Core 中使用带有 Identity 的 MySql 数据库

c++ - 我如何构建我的 C++ 代码,以便我只编写一次常用方法?

c# - 如何直接在 .NET 代码中快速创建虚拟图像