代码之家  ›  专栏  ›  技术社区  ›  TimB

无法在richtextbox中处理ctrl+s

  •  2
  • TimB  · 技术社区  · 5 年前

    我正在为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);
            }
        }
    }
    

    其他的也像这样,只是分别用斜体、下划线和删除线。三个孩子(如果我不知道的话) e.SuppressKeyPress 在ctrl-i中,字体顶部设置了一个缩进(倾斜)。StrikeOut不适用于ctrl-s。对于ctrl-shift-s,它可以工作,并且 case 'S' 块从不执行,所以ctrl-s必须在某个地方捕获并用于其他用途。但我肯定不会在其他地方使用它。建议?

    1 回复  |  直到 5 年前
        1
  •  2
  •   Reza Aghaei    5 年前

    当你拥有 MenuStrip 在窗体上包含一个菜单项 Ctrl键 + S 作为 ShortcutKey 然后 Ctrl键 + S 将由菜单项使用,并且控件将不接收键组合。

    KeyDown 事件 RichTextBox 处理快捷键和 主菜单 或者父控件可能在其 ProcessCmdKey .

    为处理快捷键 多格式文本框 ,使用以下选项之一:

    • 有一个 主菜单 包括一个 ToolStripMenuItem 使用快捷键分配给 ShortcutKeys 属性,然后处理 Click 菜单项事件:

      private void saveToolStripMenuItem_Click(object sender, EventArgs e)
      {
          MessageBox.Show("Handled by Save Menu");
      }
      
    • 重写 进程CMDKEY 方法 Form :

      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);
      }
      
    • 最后一个选项是使用 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");
              }));
          }
      }