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()
与KeysConverter.ConvertFromString()
)都将value
设置为LButton | Space
,这导致最后一行上的InvalidEnumArgumentException
。背景:
System.Windows.Forms.Keys
是一个标志枚举Enum.Parse
正常工作。 如何正确地将“PageUp”解析为
Keys.PageUp
?更新:
傻我解析工作正常。
ToolStripMenuItem mi = new ToolStripMenuItem();
mi.ShortcutKeys = Keys.PageUp;
但这引发了上述异常。
因此,在意识到之后,我吠叫了错误的树:
如何将
Keys.PageUp
分配给ToolStripMenuItem.ShortcutKeys
? 最佳答案
事实证明,ShortcutKeys
使用此逻辑来接受可能的快捷键(但是,始终不接受任何快捷键):
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
键修饰符一起使用。