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

标签 c# winforms .net-3.5 textbox newline

我有一个 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 键作为发送按钮。

最佳答案

在我看来,您面临的真正问题是表单的 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,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12553473/

相关文章:

c# - 正则表达式验证器中的验证表达式

winforms - 将 WinForms TextBox 更改为 BorderStyle.None 会导致文本被截断

c# - 将 WinForms 应用程序移植到 Mac OS

c# - 如何在应用程序重新启动之间保留对组合框中项目的选择

c# - 如何将 Func<T, bool> 转换为 Predicate<T>?

c# - WPF C# 项目的 sql server 登录失败

C# 文件夹浏览器对话框 : Getting only the selected folder's name

c# - 使用 ajax 从 C# 获取 JavaScript 对象

c# - MVC 3-这将如何运作?

wpf - 保存WPF位图效果结果图像