首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以为ToolstripComboBox菜单项添加快捷键?

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

Stack Overflow用户
提问于 2020-08-11 07:51:21
回答 2查看 144关注 0票数 0

问题1:我尝试在ToolStripComboBox中添加ToolStripMenuItem并为ToolStripMenuItem添加快捷键。它不起作用。你能让我走正确的路吗。

代码语言:javascript
复制
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键还是控制键。我使用了下面的示例代码,

代码:

代码语言:javascript
复制
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;
     }
}

提前谢谢。

EN

回答 2

Stack Overflow用户

发布于 2020-08-11 08:07:47

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

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

示例:

代码语言:javascript
复制
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!");
票数 0
EN

Stack Overflow用户

发布于 2020-08-11 08:27:24

正如另一个答案所解释的,ToolStripComboBox项不支持开箱即用的键盘快捷键。如果您由于某种原因而不得不使用ToolStripComboBox (例如,您不想对click执行某些操作,只想选择项),那么您必须自己实现这个逻辑。

下面是一个使用字典存储ComboBox每个索引的快捷键的示例。如果愿意,可以将其调整为存储值或文本,而不是索引。

代码语言:javascript
复制
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()方法如前所述

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63353804

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档