我正在尝试在 Windows 10 平板电脑 (Dell Venue 8 Pro) 上运行 Windows 窗体应用程序。通常,Windows 将触摸事件转换为明显的鼠标事件对应物。但是,它在垂直滑动时做了一些奇怪的事情。
我的应用程序有一个显示图形的自定义控件(直接从 Control
派生,在其构造函数中调用 SetStyle(ControlStyles.Selectable..., true)
)由 Direct3D 渲染。该控件将 MouseDown
-> MouseMove
-> MouseUp
序列解释为围绕观察位置旋转 View 的请求。这在台式机上工作正常,但在平板电脑上它坏了:我的自定义控件上的垂直滑动不知何故被 Windows 捕获并传递到附近的 DataGridView
,在那里它们被解释为滚动浏览的请求 table 。 DataGridView
和我的控件不是同一容器下的兄弟;它们处于控制层次结构的完全不同级别。这是一个屏幕截图:
我已经进行了一些调试,以向自己证明在垂直滑动期间没有鼠标事件进入我的控制范围。当我抬起手指时,有一些滴入右侧,但在垂直滑动期间什么也没有。
问题似乎是我的代码(在事件处理程序中)根本没有运行,因为没有输入进入我的控制。
这里发生了什么,有什么方法可以告诉 Windows 不要将在我的控件上发生的垂直滑动事件发送到完全不相关的控件?
编辑:我应该补充一点,我在我的代码中到处调用 Focus()
以确保当鼠标悬停在我的控件上时我的控件获得焦点.我将它放在 OnMouseMove
、OnMouseDown
以及几乎所有其他鼠标事件中。
编辑:我构建了一个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/