2012-09-23 96 views
2

我有一個TextBox(多行),如果我按Ctrl+Enter它只是一個新行。但我也想在Shift+Enter上做到這一點。 我試過了:C#TextBox NewLine在KeyDownEvent上模擬Ctrl + Enter

messageTextBox_KeyDown(null, new KeyEventArgs(Keys.Control | Keys.Enter)); 

但是這不起作用。

我認爲我可以做到這一點:

int lastSelectionStart = messageTextBox.SelectionStart; 
messageTextBox.Text = messageTextBox.Text.Insert(messageTextBox.SelectionStart, Environment.NewLine); 
messageTextBox.SelectionStart = lastSelectionStart; 

但我不喜歡這樣。

我該怎麼做才能使Shift + Enter與Ctrl + Enter相同?

我當前的代碼:

KeyDownEvent

if (e.KeyCode == Keys.Enter) 
{ 
    e.Handled = true; 
    if (e.Shift) 
    { 

    } 
    else if (!e.Control) 
    { 
     sendButton_Click(null, null); 
    } 
} 

在KeyPress事件:

if (e.KeyChar == (char)13) 
{ 
    e.Handled = true; 
    return; 
} 

這是因爲我想用回車鍵單獨作爲發送按鈕。

+0

改變默認行爲可能不是一個好主意。我相信用戶已經期望多行文本框允許他們只要按下回車鍵就可以進入新行。 – silvo

+0

我不這麼認爲。看看Facebook聊天。新行是Shift + Enter,單獨輸入用作發送鍵。我也想要。 – sczdavos

+0

是的,它在聊天應用程序中會有意義,但不一定是標準的Web表單。 – silvo

回答

2

對我來說聽起來像你正在對抗的真正問題是窗體的AcceptButton屬性。您無法使用KeyDown事件處理程序修復此問題,在之前處理該鍵擊事件是

這可以通過重寫表單的ProcessCmdKey()方法來解決,但最簡潔的方法是創建自己的TextBox派生控件。你可以重寫它的IsInputKey()方法來告訴Winforms你想看到Ctrl + Enter鍵。爲您的項目添加一個新類並粘貼下面顯示的代碼。編譯。從工具箱的頂部放下新控件。請注意,如何改變班級以方便您更好地成爲聊天輸入框。

using System;使用System.Windows.Forms的 ;

class ChatBox : TextBox { 
    public ChatBox() { 
     this.Multiline = true; 
    } 
    protected override bool IsInputKey(Keys keyData) { 
     if (keyData == (Keys.Shift | Keys.Enter)) return true; 
     return base.IsInputKey(keyData); 
    } 
    protected override void OnKeyDown(KeyEventArgs e) { 
     if (e.KeyData == (Keys.Shift | Keys.Enter)) { 
      int pos = this.SelectionStart; 
      this.SelectedText = Environment.NewLine; 
      this.SelectionStart = pos; 
      e.Handled = e.SuppressKeyPress = true; 
      return; 
     } 
     base.OnKeyDown(e); 
    } 
} 
+1

好的。這正是我的想法,也是我的問題。但如果沒有簡單的方法如何模擬Ctrl + Enter我會這樣做。請注意,您的代碼SelectionStart需要如下所示:'messageTextBox.SelectionStart = lastSelectionStart + Environment.NewLine.Length;'還有'ScrollToCaret();' – sczdavos

+0

您需要開始讓本地控件看到不同的按鍵。如果沒有必要,最好避免這種情況。 –