循环填充快捷键
Posted
技术标签:
【中文标题】循环填充快捷键【英文标题】:Populate ShortcutKeys in a loop 【发布时间】:2014-03-25 13:57:51 【问题描述】:我有一个ToolStripMenuItem,它作为附加到我的Form 的MenuStrip 的下拉菜单。此菜单的内容根据表单其余部分的状态而变化,并在循环中填充。
问题是现在我想添加这个菜单中的项目根据它们在列表中的位置具有键盘快捷键的功能。列表中的第一项应为 Ctrl+1,第二项应为 Ctrl+2,依此类推。
由于ShortcutKeys 是使用Keys 枚举设置的,我不知道如何将递增值映射到枚举中的正确值。我曾希望这样的事情会奏效,但它没有:
newToolStripMenuItem.ShortcutKeys = Keys.Control | (Keys.D0 + menuItemNumber++);
编辑
可能还有其他事情发生。根据this asker,我的初始解决方案应该有效,Migol 提出的解决方案会产生相同的结果。 ShortcutKeys 中的值显示为一些奇怪的字符组合,没有明显的模式。
【问题讨论】:
您只是对调试器显示的内容感到困惑。这会让人感到困惑,因为 Keys 枚举具有 [Flags] 属性,这只是部分正确。继续前进,你没有真正的问题。 About override ProcessCMDKey in c# winform的可能重复 @HansPassant 是的,这是有道理的,但是如果两种解决方案都显示相同的内容,我可能会正确设置它,并且还有其他一些原因导致它无法正常工作。哦,对于您的第二条评论,我的问题不在于我检查值。我不在乎代码对我来说是什么样子,但它仍然需要在按下键时触发事件。 【参考方案1】:您可以像这样使用Enum.Parse
方法:
string enumName = "D" + menuItemNumber++;
newToolStripMenuItem.ShortcutKeys = Keys.Control | (Keys)Enum.Parse(typeof(Keys), enumName);
Enum.Parse documentation
【讨论】:
好吧,在这种情况下,我的字符串将是 "D" + menuItemNumber++,但我开始怀疑还有更多事情要做,因为这与我的想法显然有效对于this asker。 @Fr33dan 您的解决方案有一个重大挫折 - 它包含幻数并且更难理解。 我不知道你所说的幻数是什么意思,但我想理解起来有点棘手。无论哪种方式,因为它们产生相同的结果,所以我的问题一定不是设置值,而是其他问题。我认为这可能与打开表单后设置键盘快捷键有关,但我仍在调查中。 @Fr33dan 幻数是读者不清楚其含义的任何常数。在您的情况下,它是47
。
哦,我(与链接的解决方案不同)将 Keys.D0 转换为 int 而不是专门硬编码其 int 值以避免它突然出现。它本身就会非常混乱。【参考方案2】:
这很尴尬,但这个问题与这篇文章中提到的任何事情都完全无关。这是我自己的不良编程习惯加上错字造成的愚蠢错误。
在我最初的询问中,我将局部变量的名称从 processorToolStripMenuItem
更改为 newToolStripMenuItem
,因为这在应用程序的上下文中更有意义。我添加它的项目是一个名为 procesorToolStripMenuItem
的字段,如您所见,它缺少一个“s”。
对于设置键盘快捷键的代码行,我犯了同样的错字,因此设置了错误的键盘快捷键。一开始他们就不应该被命名为彼此如此相似的东西。
【讨论】:
以上是关于循环填充快捷键的主要内容,如果未能解决你的问题,请参考以下文章