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);
            }
        
        }

 

posted @ 2023-06-13 18:18  盛沧海  阅读(833)  评论(0编辑  收藏  举报