2012-09-23 37 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

您需要开始让本地控件看到不同的按键。如果没有必要,最好避免这种情况。 –