Silverlight中文字框新增回車事件後,換行無法清除的解決方法

雲霏霏發表於2014-06-04

在開發Silverlight的專案中,為了更好的使用者體驗,我們常要給一些控制元件新增一些快捷鍵。然而,在Silverlight中當使用者回車提交後,游標停留在文字框的第二行怎麼也清除不掉,經過一段時間研究,終於找到解決方法,特寫此文章與大家分享一下:

有時候我們在網站中,比如使用者評論,新增一個Enter鍵盤事件,快速提交,需要給文字框新增鍵盤事件處理方法,在這裡先說一下組合鍵的使用方法,程式碼如下:

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。

 

 

 

相關文章