无法处理RichTextBox中的Ctrl + S

时间:2019-01-24 16:15:16

标签: c# .net winforms 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);
        }
    }
}

其他看起来也一样,分别是斜体,下划线和删除线。对于其中三个象牙(尽管如果我不对ctrl-I进行“ e.SuppressKeyPress操作,则缩进会设置在字体斜体顶部)。只是删除线对ctrl-S不起作用。ctrl-shift -S有效,并且case 'S'块永远不会执行,因此ctrl-S必须以某种方式被捕获并用于其他用途。但是我绝对不会在其他地方使用它。建议吗?

1 个答案:

答案 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);
    }