我正在为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);
}
}
}
其他看起来也一样,分别是斜体,下划线和删除线。对于其中三个象牙(尽管如果我不对ctrl-I进行“ e.SuppressKeyPress
操作,则缩进会设置在字体斜体顶部)。只是删除线对ctrl-S不起作用。ctrl-shift -S有效,并且case 'S'
块永远不会执行,因此ctrl-S必须以某种方式被捕获并用于其他用途。但是我绝对不会在其他地方使用它。建议吗?
答案 0 :(得分:2)
当您在表单上有一个MenuStrip
时,其中包含一个菜单项,其中 Ctrl + S 为ShortcutKey
,然后 Ctrl < / kbd> + S 将被菜单项占用,并且您的控件将不会收到组合键。
KeyDown
的{{1}}事件对于处理快捷键为时已晚,并且RichTextBox
或父级控件可能会在其MenuStrip
中消耗组合键。
要处理ProcessCmdKey
的快捷键,请使用以下选项之一:
拥有一个RichTextBox
,其中包括一个分配了MenuStrip
属性快捷键的ToolStripMenuItem
,然后处理菜单项的ShortcutKeys
事件:
Click
覆盖private void saveToolStripMenuItem_Click(object sender, EventArgs e)
{
MessageBox.Show("Handled by Save Menu");
}
的{{1}}方法:
ProcessCmdKey
最后一个选项是使用Form
的{{1}}事件:
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);
}