ToolStripMenuItem mi = new ToolStripMenuItem();
var value = new KeysConverter().ConvertFromString("PageUp");
// value = Enum.Parse(typeof (Keys), "PageUp");
var cast = (Keys) value;
mi.ShortcutKeys = cast;
Run Code Online (Sandbox Code Playgroud)
我正在尝试将字符串"PageUp"转换为适当的System.Windows.Forms.Keys
值.但是,两种解析方法(Enum.Parse()
vs. KeysConverter.ConvertFromString()
)都设置value
为LButton | Space
,这导致InvalidEnumArgumentException
了最后一行.
背景:
System.Windows.Forms.Keys
是一个标志枚举Enum.Parse
正常.如何正确解析"PageUp" Keys.PageUp
?
更新:
傻我.解析工作正常.
ToolStripMenuItem mi = new ToolStripMenuItem();
mi.ShortcutKeys = Keys.PageUp;
Run Code Online (Sandbox Code Playgroud)
但是这个抛出了上面提到的异常.
所以在意识到我咆哮了错误的树之后:
一个人怎么可以分配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;
}
Run Code Online (Sandbox Code Playgroud)
因此,您可以单独使用 , None
, Delete
, Insert
, F1
-键,或将所有其他键与, , and, 仅用作附加键修饰符。F12
Alt
Ctrl
Shift
归档时间: |
|
查看次数: |
1689 次 |
最近记录: |