如何:将Keys.PageUp分配给ToolStripMenuItem.ShortcutKeys

yas*_*891 6 .net c# winforms

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())都设置valueLButton | Space,这导致InvalidEnumArgumentException了最后一行.

背景:

  • System.Windows.Forms.Keys 是一个标志枚举
  • PageUp的值为33,LButton为1,Space为32 ==>含义Enum.Parse正常.

如何正确解析"PageUp" Keys.PageUp


更新:
傻我.解析工作正常.

ToolStripMenuItem mi = new ToolStripMenuItem();
mi.ShortcutKeys = Keys.PageUp;
Run Code Online (Sandbox Code Playgroud)

但是这个抛出了上面提到的异常.
所以在意识到我咆哮了错误的树之后:

一个人怎么可以分配Keys.PageUpToolStripMenuItem.ShortcutKeys

Pet*_*lin 2

事实证明,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, 仅用作附加键修饰符。F12AltCtrlShift