【问题标题】:C# TextBox NewLine simulate Ctrl+Enter on KeyDownEventC# TextBox NewLine 在 KeyDownEvent 上模拟 Ctrl+Enter
【发布时间】:2012-09-15 05:32:00
【问题描述】:

我有一个TextBox(多行),如果我按Ctrl+Enter,它只会换行。但我也想在Shift+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 相同?

我当前的代码:

KeyDown 事件

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;
}

这是因为我想单独使用 Enter 键作为发送按钮。

【问题讨论】:

  • 更改默认行为可能不是一个好主意。我相信用户已经开始期望多行文本框允许他们在想要进入新行时只需按 Enter 键。
  • 我不这么认为。看脸书聊天。新行是 Shift+Enter,单独的 Enter 用作发送键。我也想要。
  • 是的,它在聊天应用程序中是有意义的,但在标准的网络表单中却不一定。

标签: c# winforms .net-3.5 textbox newline


【解决方案1】:

在我看来,您要解决的真正问题是表单的 AcceptButton 属性。您无法使用 KeyDown 事件处理程序来解决此问题,击键是在 到达事件之前处理的。

这可以通过覆盖表单的 ProcessCmdKey() 方法来解决,但最简洁的方法是创建您自己的 TextBox 派生控件。你可以重写它的 IsInputKey() 方法来告诉 Winforms 你想看到 Ctrl+Enter 键。向您的项目添加一个新类并粘贴如下所示的代码。编译。从工具箱顶部删除新控件。请注意如何根据您的方便更改该类,使其更适合作为聊天输入框。

使用系统; 使用 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);
    }
}

【讨论】:

  • 好的。这正是我的想法,也是我的问题。但是,如果没有简单的方法来精确模拟 Ctrl+Enter,我会这样做。您的代码 SelectionStart 的注释必须是这样的:messageTextBox.SelectionStart = lastSelectionStart + Environment.NewLine.Length;ScrollToCaret();
  • 您需要 pinvoke 才能让本机控件看到不同的击键。不必要时最好避免这样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多