Silverlight中文本框添加回车事件后,换行无法清除的解决方法

在开发Silverlight的项目中,为了更好的用户体验,我们常要给一些控件添加一些快捷键。然而,在Silverlight中当用户回车提交后,光标停留在文本框的第二行怎么也清除不掉,经过一段时间研究,终于找到解决方法,特写此文章与大家分享一下:

有时候我们在网站中,比如用户评论,添加一个回车键盘事件,快速提交,需要给文本框添加键盘事件处理方法,在这里先说一下组合键的使用方法,代码如下:

复制代码

private void txtToSend_KeyDown(object sender, KeyEventArgs e)
{
    ModifierKeys keys = Keyboard.Modifiers;
    if (keys == ModifierKeys.Control && (e.Key == Key.Enter))
    {
      处理方法
    }
}

复制代码

这里主要需要注意的是ModifierKeys,这里与WinForm中不同。

在Silverlight中,给文本框添加了回车提交事件后,但是回车过后,清除文本框内容,发现光标停留在文本框第二行,在后台用代码怎么也清除不掉,下面来讲一下解决办法:

设置文本框的 AcceptsReturn 为 False ,这一文本框就不会再换行啦!

但是,新的问题来了,文本框的内容怎么换行呢?当然我们想到了使用Ctrl + Enter 来换行,实现代码如下:

 

复制代码

private void txtToSend_KeyDown(object sender, KeyEventArgs e)
{
     ModifierKeys keys = Keyboard.Modifiers; if (keys == ModifierKeys.Control && (e.Key == Key.Enter)) { txtToSend.Text += Environment.NewLine; }
复制代码

 

运行后,却发现并不能实现换行,只是光标移动到了开头,解决办法就是添加下面一行代码:

txtToSend.SelectionStart = txtToSend.Text.Length;

使用这句话,设置光标的位置,这样就可以看到效果了。当然我们还有实现回车提交信息的功能。

完整代码如下:

 

复制代码
 private void txtToSend_KeyDown(object sender, KeyEventArgs e)
      {
         ModifierKeys keys = Keyboard.Modifiers;
         if (keys == ModifierKeys.Control && (e.Key == Key.Enter))
         {
            txtToSend.Text += Environment.NewLine;
            txtToSend.SelectionStart = txtToSend.Text.Length;
         }
         else
         {
            if (e.Key == Key.Enter)
            {
               radButton1_Click(null, null);
            }
         }
      }
复制代码

 

注意,当你按下Ctrl + Enter 时,同样会触发Enter事件,所以要把Enter的处理方法放在Else里面,这样就没有问题了。

当然,为了更好的用户体验,我们可以添加一个下拉框,让用户选中自己的操作方式,选中快捷键的功能,这里写两个键盘处理事件,代码如下:

复制代码
private void txtToSend_KeyDown2(object sender, KeyEventArgs e)
      {
         ModifierKeys keys = Keyboard.Modifiers;
         if (keys == ModifierKeys.Control && (e.Key == Key.Enter))
         {
            radButton1_Click(null, null);
         }
      }

      private void txtToSend_KeyDown(object sender, KeyEventArgs e)
      {
         ModifierKeys keys = Keyboard.Modifiers;
         if (keys == ModifierKeys.Control && (e.Key == Key.Enter))
         {
            txtToSend.Text += Environment.NewLine;
            txtToSend.SelectionStart = txtToSend.Text.Length;
         }
         else
         {
            if (e.Key == Key.Enter)
            {
               radButton1_Click(null, null);
            }
         }
      }
复制代码

然后,在下拉框的SelectionChanged事件中添加如下代码:

复制代码
private void cmbHotKey_SelectionChanged(object sender, Telerik.Windows.Controls.SelectionChangedEventArgs e)
      {
         if (cmbHotKey != null)
         {
            if (cmbHotKey.SelectedIndex == 0)
            {
               txtToSend.KeyDown -= txtToSend_KeyDown;
               txtToSend.KeyDown -= txtToSend_KeyDown2;
               txtToSend.KeyDown += txtToSend_KeyDown;
               txtToSend.AcceptsReturn = false;
            }
            else
            {
               txtToSend.KeyDown -= txtToSend_KeyDown;
               txtToSend.KeyDown -= txtToSend_KeyDown2;
               txtToSend.KeyDown += txtToSend_KeyDown2;
               txtToSend.AcceptsReturn = true;
            }
         }
      }
复制代码

这里要注意的是,页面初始化时,控件能还没有初始化完成,所以要判断一下控件是否为NULL。

 

 

 

posted @   雲霏霏  阅读(515)  评论(1编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示