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

adv*_*v12 8 c# scroll touch winforms windows-10

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

我的应用程序有一个自定义控件(直接从其构造函数中Control调用派生SetStyle(ControlStyles.Selectable..., true)),显示Direct3D呈现的图形.控件将MouseDown- > MouseMove- > MouseUp序列解释为旋转关于外观位置的视图的请求.这在桌面上运行良好,但在平板电脑上它会中断:我的自定义控件上的垂直滑动以某种方式被Windows捕获并传递到附近DataGridView,在那里它们被解释为滚动表格的请求.在DataGridView我的控制是不一样的容器下的兄弟姐妹; 它们处于完全不同的控制层次级别.这是一个截图:

应用程序的屏幕截图显示了垂直和水平滑动的不同解释

我做了一些调试,以证明在垂直滑动过程中没有任何鼠标事件可以控制我.当我抬起手指时,右边有一些涓涓细流,但在垂直滑动过程中没有任何东西.

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

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

编辑:我应该补充一点,我Focus()在我的代码中调用了所有地方,以确保我的控件在鼠标悬停时聚焦.我把它放在OnMouseMove,OnMouseDown并且几乎每个其他鼠标事件.

编辑:我已经构建了一个小型Visual Studio 2010解决方案来演示此问题.这里有太多的代码可以在线重现,但很容易理解.构建它,将其安装在Windows 10平板电脑上,然后尝试在最右边的控件中垂直滑动.请注意,而不是那个控件接收一堆鼠标事件,DataGridView火灾Scroll.

更新:我已经明确测试了在DataGridView获取Scroll事件时我的控件是否集中.如果我如上所述呼叫Focus()我的控制以响应MouseMove等等,我的控制确实得到焦点并在垂直滑动时保持它DataGridView.Scroll.在DataGridView.Scroll事件处理程序中,我打印出我的控件是否是焦点,它是.所以这不是DataGridView偷窃重点的问题; DataGridView即使我的控制力集中,这也是我操控滑动的问题.

注意:如果我设置dataGridView.ScrollBarsScrollBars.None,则滑动的鼠标事件会转到我的控件.我一直在弄乱丑陋的黑客,每当我的控制集中注意力时隐藏滚动条,并在每次聚焦时显示它们DataGridView.但他们都是丑陋的黑客,有令人不快的副作用.

Yos*_*rgi 1

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