如何:分配密钥.分页到ToolStripMenuItem.ShortcutKeys
本文关键字:ToolStripMenuItem ShortcutKeys 分页 密钥 分配 如何 | 更新日期: 2023-09-27 18:11:38
ToolStripMenuItem mi = new ToolStripMenuItem();
var value = new KeysConverter().ConvertFromString("PageUp");
// value = Enum.Parse(typeof (Keys), "PageUp");
var cast = (Keys) value;
mi.ShortcutKeys = cast;
我试图将字符串"PageUp"转换为适当的System.Windows.Forms.Keys
值。然而,两种解析方法(Enum.Parse()
vs. KeysConverter.ConvertFromString()
)都将value
设置为LButton | Space
,这导致最后一行的InvalidEnumArgumentException
。
-
System.Windows.Forms.Keys
是一个Flags枚举 - PageUp的值为33,LButton为1,Space为32 ==>表示
Enum.Parse
工作正常。
我如何正确解析"PageUp"成Keys.PageUp
?
更新:
愚蠢的我。解析工作正确。
ToolStripMenuItem mi = new ToolStripMenuItem();
mi.ShortcutKeys = Keys.PageUp;
但是这个会抛出上面提到的异常。
所以当我意识到我找错了对象:
如何将Keys.PageUp
分配给ToolStripMenuItem.ShortcutKeys
?
事实证明,ShortcutKeys
使用此逻辑来接受可能的快捷键(然而,None总是被接受):
public static bool IsValidShortcut(Keys shortcut) {
// should have a key and one or more modifiers.
Keys keyCode = (Keys)(shortcut & Keys.KeyCode);
Keys modifiers = (Keys)(shortcut & Keys.Modifiers);
if (shortcut == Keys.None) {
return false;
}
else if ((keyCode == Keys.Delete) || (keyCode == Keys.Insert)) {
return true;
}
else if (((int)keyCode >= (int)Keys.F1) && ((int)keyCode <= (int)Keys.F24)) {
// function keys by themselves are valid
return true;
}
else if ((keyCode != Keys.None) && (modifiers != Keys.None)) {
switch (keyCode) {
case Keys.Menu:
case Keys.ControlKey:
case Keys.ShiftKey:
// shift, control and alt arent valid on their own.
return false;
default:
if (modifiers == Keys.Shift) {
// shift + somekey isnt a valid modifier either
return false;
}
return true;
}
}
// has to have a valid keycode and valid modifier.
return false;
}
因此,您可以单独使用None
, Delete
, Insert
, F1
- F12
键,或使用Alt
, Ctrl
和Shift
键修饰符的所有其他键。
一旦你问对了问题,你就会找到答案....
这个为我澄清了这一点:将Windows Forms ToolStripMenuItem ShortcutKeys属性设置为numpad键不起作用
quote
在快捷键中必须使用Ctrl或Alt。