我试图在Windows 10平板电脑(Dell Venue 8 Pro)上运行Windows窗体应用。通常,Windows将触摸事件转换为明显的鼠标事件对应物。但是,它使用垂直滑动做了一些奇怪的事情。
我的应用有一个自定义控件(直接来自Control
并在其构造函数中调用SetStyle(ControlStyles.Selectable..., true)
),显示Direct3D呈现的图形。该控件解释MouseDown
- > MouseMove
- > MouseUp
序列作为旋转关于外观位置的视图的请求。这在桌面上工作正常,但在平板电脑上它会中断:我的自定义控件上的垂直滑动以某种方式被Windows捕获并传递到附近的DataGridView
,在那里它们被解释为滚动表格的请求。 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
聚焦时显示它们。但他们都是丑陋的黑客,带来了令人不快的副作用。