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是一个标志枚举
  • PageUp的值为33,LButton为1,空格为32 ==>表示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;
    }
    

    因此,您可以单独使用NoneDeleteInsertF1-F12键,也可以将所有其他键与AltCtrlShift键修饰符一起使用。

    10-05 21:22