是否可以为ToolstripComboBox菜单项添加快捷键?

问题描述

问题1: 我试图在ToolStripMenuItem中添加ToolStripComboBox并为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;
     }
}

谢谢。

解决方法

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!");
,

如另一个答案中所述,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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...