【问题标题】:Is it possible to add the shortcut key for ToolstripComboBox menu items?是否可以为 ToolstripComboBox 菜单项添加快捷键?
【发布时间】:2020-08-11 07:51:21
【问题描述】:

问题 1: 我尝试在ToolStripComboBox 中添加ToolStripMenuItem 并添加了ToolStripMenuItem 的快捷键。它不工作。你能不能把我放在正确的地方。

ToolStripMenuItem item1 = new ToolStripMenuItem (){Text = "A", ShortcutKeys=Keys.Control | Keys.D0};
ToolStripMenuItem item2 = new ToolStripMenuItem (){Text = "B", ShortcutKeys=Keys.Control | Keys.D1};
toolStripComboBox1.Items.Add(item1);
toolStripComboBox1.Items.Add(item2);

问题 2: 如果我使用 KeyDown 事件实现我的快捷方式,则该事件会在按下右 alt 键时触发两次。在第一个触发器中,KeyEventArgs 提供控制键的数据。因此,无法获取按下的键是 Alt 还是 Control 键。我使用了下面的示例代码,

代码:

this.KeyPreview = true;
this.KeyDown += Form1_KeyDown;

private void Form1_KeyDown(object sender, KeyEventArgs e)
{
     if(e.Control)
     {
        if(e.KeyCode == Keys.D0)
             toolStripComboBox1.SelectedIndex = 0;
        else if(e.KeyCode == Keys.D1)
             toolStripComboBox1.SelectedIndex = 1;
     }
}

提前致谢。

【问题讨论】:

    标签: c# winforms


    【解决方案1】:

    ToolStripComboBox 不支持开箱即用的快捷方式,因为它的项目没有点击事件。实际上,Items 属性是一个ObjectCollection,所以它并不真正期望ToolStripMenuItem 的集合,正如您所想的那样。当您添加 ToolStripMenuItem 时,它会被视为任何其他对象。

    如果快捷方式的目的是在单击/选择项目时执行某些操作,请考虑改用ToolStripDropDownButton

    示例:

    var dropDownButton = new ToolStripDropDownButton() { Text = "Open me" };
    toolStrip1.Items.Add(dropDownButton);
    
    ToolStripMenuItem item1 = new ToolStripMenuItem() { Text = "A", ShortcutKeys = Keys.Control | Keys.D0 };
    ToolStripMenuItem item2 = new ToolStripMenuItem() { Text = "B", ShortcutKeys = Keys.Control | Keys.D1 };
    dropDownButton.DropDownItems.Add(item1);
    dropDownButton.DropDownItems.Add(item2);
    
    item1.Click += (obj, args) => MessageBox.Show("Item1 was clicked!");
    item2.Click += (obj, args) => MessageBox.Show("Item2 was clicked!");
    

    【讨论】:

      【解决方案2】:

      正如另一个答案中所解释的,ToolStripComboBox 项目不支持开箱即用的键盘快捷键。如果您出于某种原因必须使用ToolStripComboBox(例如,您不想在单击时执行某些操作而只想选择项目),则必须自己实现逻辑。

      这是一个使用字典来存储 ComboBox 的每个索引的快捷键的示例。如果你愿意,你可以调整它来存储值或文本而不是索引。

      private Dictionary<Keys, int> comboBoxShortcutKeys = new Dictionary<Keys, int>();
      
      public Form1()
      {
          InitializeComponent();
      
          this.KeyPreview = true;
          this.KeyDown += (obj, args) =>
          {
              if (comboBoxShortcutKeys.ContainsKey(args.KeyData))
              {
                  toolStripComboBox1.SelectedIndex = comboBoxShortcutKeys[args.KeyData];
              }
          };
      }
      
      private void AddComboBoxItems()
      {
          toolStripComboBox1.Items.Add("A");
          comboBoxShortcutKeys.Add(Keys.Control | Keys.D0, 0);
      
          toolStripComboBox1.Items.Add("B");
          comboBoxShortcutKeys.Add(Keys.Control | Keys.D1, 1);
      }
      

      请注意,要让快捷方式在表单上的任何位置起作用,KeyPreview 属性需要设置为 true,如上所示。或者,您可以覆盖 ProcessCmdKey() 方法 as explained here

      【讨论】:

      • 感谢您的建议。我已经使用 KeyDown 事件尝试了我的实现。此事件在按下右 alt 键时触发了两次。在第一次触发中,它显示为按下控制键。如何区分?
      • 我不确定我是否遵循。无论如何,请确保您使用的是KeyData 而不是KeyCode。此外,请确保使用ContainsKey 检查按下的Keys 确实存在于字典中,如上所示。
      • 是的,我确保了这一点。如果我按下右 alt + 0,我会在第一次触发时在按键事件中获得数据 (Keys.Control | Keys.D0)。我不知道它是如何显示的。请让我知道您对此有什么想法。
      • 如果没有看到您的代码,我无法告诉您出了什么问题。您可以编辑问题并包含更新的代码,或者您可以在 Pastebin 之类的内容上创建一个粘贴,并将链接留在评论中,以便我查看。
      • 我在 Question2 中添加了我实现的代码。可以请研究一下并分享您的想法。
      猜你喜欢
      • 1970-01-01
      • 2014-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-09
      • 1970-01-01
      相关资源
      最近更新 更多