C#TextBox NewLine在KeyDownEvent上模拟Ctrl + Enter

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#TextBox NewLine在KeyDownEvent上模拟Ctrl + Enter相关的知识,希望对你有一定的参考价值。

我有一个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相同?

我目前的代码:

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

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

答案

对我而言,就像你正在解决的真正问题是表单的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);
    }
}

以上是关于C#TextBox NewLine在KeyDownEvent上模拟Ctrl + Enter的主要内容,如果未能解决你的问题,请参考以下文章

如何阻止 WPF KeyDown 事件从某些包含的控件(例如 TextBox)冒泡?

Keydown事件发生两次

TextBox控件常用方法总结

c# keydown事件问题

wpf textbox只能输入数字,屏蔽中文输入

关于键盘KeyDown事件