WPF 绑定command在触屏上操作时,即使点中button也可能不触发
现象:
WPF程序绑定的command在触摸屏上,点击button后,button绑定的事件偶尔会出现不响应的情况。确认100%点击有效,不会出现误触的情况。
但是用鼠标点击,绝对不会出现这种现象。
原因:
在非触屏环境,bingding command是由点击来触发,即是使用鼠标等输入设备来执行点击触发command,调用的是系统外设API来进行处理,触发的是相应控件的click事件。
但在触屏环境下,绑定的command则是由手指或触摸笔等触摸屏幕后,再由内部的实时触控API或多点触控API进行处理……而这两个API在同一个HWND(HWND 的全称是 Handle to Window,表示窗口句柄。)上互斥。
详细资料见MSDN:Disable the RealTimeStylus - WPF .NET Framework | Microsoft Learn
尝试方法:
禁用RealTimeStylus后,在测试中又会出现另外的问题——即在触屏上用滚动就不行了,这就引入了新的问题。若项目中不需要滚动,此还是能解决存在问题的;但若需要滚动,并应用于触控环境,这就是个问题了。
当然有治标的方法是将所有的button绑定command全部转为touch事件来触发;只是如此在非触控环境,如此就不能正常使用了。
当前为了避免button再次出现点中但是不响应的情况,目前采用的方法是在初始化完成后移除相应button的Stylus相关的事件,其操作如下:
private void RemoveButtonStylus() { Button[] buttons = new Button[] { Send, MainNeedleButton_CB, FixedNeedleButton1_CB, FixedNeedleButton2_CB, FixedNeedleButton3_CB }; foreach (var item in buttons) { Stylus.SetIsFlicksEnabled(item, false); Stylus.SetIsPressAndHoldEnabled(item, false); Stylus.SetIsTapFeedbackEnabled(item, false); Stylus.SetIsTouchFeedbackEnabled(item, false); } }
*****有道无术,术尚可求;有术无道,止于术。*****