无法在 RichTextBox 中处理 Ctrl + S
Cannot handle Ctrl + S in RichTextBox
我正在为我的 winforms 应用程序的一部分编写一个文本编辑器。它具有常用的粗体、下划线、删除线、斜体工具栏按钮。但是,出于可访问性和工作流程效率的原因,我也想添加快捷方式。
相关代码如下:
private void TextInput_KeyDown(object sender, KeyEventArgs e)
{
if(e.Control)
{
switch(e.KeyCode)
{
case Keys.B: ChangeFontStyle('B');
break;
case Keys.I: e.SuppressKeypress = true;
ChangeFontStyle('I');
break;
// ... the others (U and S) look like the one for B, with the matching letters...
}
}
}
}
private voide ChangeFontStyle(char targetStyle)
{
switch(targetStyle)
{
case 'B':
if(TextInput.Selectionfont.Bold)
{
TextInput.SelectionFont = new Font(TextInput.Selectionfont, TextInput.Selectionfont.Style ^ FontStyle.Bold);
}
else
{
TextInput.SelectionFont = new Font(TextInput.Selectionfont, TextInput.SelectionFont.Style | FontStyle.Bold);
}
}
}
其他的也是这样,分别是斜体、下划线和删除线。对于其中三个 itorks(尽管如果我不在 ctrl-I 上“e.SuppressKeyPress
,则会在字体顶部设置一个缩进,变成斜体)。只是删除线不适用于 ctrl-S。使用 ctrl-shift -S 它有效,并且 case 'S'
块永远不会执行,因此 ctrl-S 必须以某种方式在某个地方被捕获并用于其他用途。但我绝对不会在其他地方使用它。建议?
当你在表单上有一个 MenuStrip
时,包括一个菜单项 Ctrl + S 作为 ShortcutKey
, 然后 Ctrl + S 将被菜单项占用,您的控件将不会收到组合键。
KeyDown
RichTextBox
的事件对于处理快捷键来说来不及了,MenuStrip
或父控件可能会消耗其 ProcessCmdKey
中的组合键。
要处理 RichTextBox
的快捷键,请使用以下选项之一:
有一个MenuStrip
包括一个ToolStripMenuItem
分配给它的ShortcutKeys
属性的快捷键,然后处理菜单项的Click
事件:
private void saveToolStripMenuItem_Click(object sender, EventArgs e)
{
MessageBox.Show("Handled by Save Menu");
}
覆盖Form
的ProcessCmdKey
方法:
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
if (keyData == (Keys.Control | Keys.S))
{
MessageBox.Show("Handled by Form");
return true;
}
return base.ProcessCmdKey(ref msg, keyData);
}
最后一个选项是使用 RichTextBox
的 PreviewKeyDown
事件:
private void richTextBox1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
if (e.KeyData == (Keys.Control | Keys.S))
{
e.IsInputKey = true;
BeginInvoke(new Action(() => {
MessageBox.Show("Handled by RichTextBox");
}));
}
}
我正在为我的 winforms 应用程序的一部分编写一个文本编辑器。它具有常用的粗体、下划线、删除线、斜体工具栏按钮。但是,出于可访问性和工作流程效率的原因,我也想添加快捷方式。
相关代码如下:
private void TextInput_KeyDown(object sender, KeyEventArgs e)
{
if(e.Control)
{
switch(e.KeyCode)
{
case Keys.B: ChangeFontStyle('B');
break;
case Keys.I: e.SuppressKeypress = true;
ChangeFontStyle('I');
break;
// ... the others (U and S) look like the one for B, with the matching letters...
}
}
}
}
private voide ChangeFontStyle(char targetStyle)
{
switch(targetStyle)
{
case 'B':
if(TextInput.Selectionfont.Bold)
{
TextInput.SelectionFont = new Font(TextInput.Selectionfont, TextInput.Selectionfont.Style ^ FontStyle.Bold);
}
else
{
TextInput.SelectionFont = new Font(TextInput.Selectionfont, TextInput.SelectionFont.Style | FontStyle.Bold);
}
}
}
其他的也是这样,分别是斜体、下划线和删除线。对于其中三个 itorks(尽管如果我不在 ctrl-I 上“e.SuppressKeyPress
,则会在字体顶部设置一个缩进,变成斜体)。只是删除线不适用于 ctrl-S。使用 ctrl-shift -S 它有效,并且 case 'S'
块永远不会执行,因此 ctrl-S 必须以某种方式在某个地方被捕获并用于其他用途。但我绝对不会在其他地方使用它。建议?
当你在表单上有一个 MenuStrip
时,包括一个菜单项 Ctrl + S 作为 ShortcutKey
, 然后 Ctrl + S 将被菜单项占用,您的控件将不会收到组合键。
KeyDown
RichTextBox
的事件对于处理快捷键来说来不及了,MenuStrip
或父控件可能会消耗其 ProcessCmdKey
中的组合键。
要处理 RichTextBox
的快捷键,请使用以下选项之一:
有一个
MenuStrip
包括一个ToolStripMenuItem
分配给它的ShortcutKeys
属性的快捷键,然后处理菜单项的Click
事件:private void saveToolStripMenuItem_Click(object sender, EventArgs e) { MessageBox.Show("Handled by Save Menu"); }
覆盖
Form
的ProcessCmdKey
方法:protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { if (keyData == (Keys.Control | Keys.S)) { MessageBox.Show("Handled by Form"); return true; } return base.ProcessCmdKey(ref msg, keyData); }
最后一个选项是使用
RichTextBox
的PreviewKeyDown
事件:private void richTextBox1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) { if (e.KeyData == (Keys.Control | Keys.S)) { e.IsInputKey = true; BeginInvoke(new Action(() => { MessageBox.Show("Handled by RichTextBox"); })); } }