我有一个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键作为发送按钮。
答案 0 :(得分:2)
听起来我正在解决的真正问题是表单的AcceptButton属性。您无法使用KeyDown事件处理程序解决此问题,在之前处理了。
这可以通过覆盖表单的ProcessCmdKey()方法来解决,但最简单的方法是创建自己的TextBox派生控件。您可以覆盖其IsInputKey()方法以告知Winforms您要查看Ctrl + Enter键。在项目中添加一个新类并粘贴下面显示的代码。编译。从工具箱顶部删除新控件。请注意如何改变课程以方便您更好地成为聊天输入框。
使用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);
}
}