解决控件键盘事件连续触发

问题描述:

当光标聚焦在一个表单的提交按钮上,用户按回车,程序会访问服务器进行数据保存,此时会阻塞UI线程。如果此时用户继续拼命按回车,这些事件会堆积在那里,待服务器返回结果后,UI线程会接收到这些堆积的回车事件,继续触发提交操作

解决思路:

  1. 将保存方法改成异步,不再阻塞UI线程,并在用户按下回车后,将控件离焦。待方法执行完成,再将控件重新聚焦

  2. 不使用异步,同样需要在用户按下回车后,将控件离焦,待方法执行完成,再将控件重新聚焦,但要注意一点,重新聚焦前要让UI线程有喘息的时间来处理掉堆积的事件,否则这些事件依然会在控件重新聚焦后落到控件上

方案1同步改异步,交互方案、代码结构要做调整,方案2调整较小,但要注意给UI线程留喘息的时间

以下代码以文本框控件示例

        /// <summary>
        /// Txt1键盘事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Txt1_KeyDown(object sender, KeyEventArgs e)
        {
            //离焦
            Txt3.Focus();

            //业务处理
            Thread.Sleep(500);
            if (e.Key == Key.Enter)
            {
                Txt1.Text = Txt1.Text + "1";
            }
            
            //聚焦回来
            Task.Factory.StartNew(() =>
            {
                Thread.Sleep(100);//等待一段时间,让UI线程处理掉堆积的回车事件

                //线程内操作UI线程的控件要使用Dispatcher
                Dispatcher.BeginInvoke(new Action(() => {
                    Txt1.Focus();
                }));
            });
        }
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值