Как: назначить Keys.PageUp для ToolStripMenuItem.ShortcutKeys - PullRequest
6 голосов
/ 18 октября 2011
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 - перечисление Flags
  • PageUp имеет значение 33, LButton - 1, пробел - 32 ==>, что означает Enum.Parse, работает правильно.

Как правильно разобрать "PageUp" в Keys.PageUp?


Обновление:
Дурак я. синтаксический анализ работает правильно.

ToolStripMenuItem mi = new ToolStripMenuItem();
mi.ShortcutKeys = Keys.PageUp;

но этот бросает вышеупомянутое исключение.
Поэтому, поняв, я заколдовал не то дерево:

Как можно назначить Keys.PageUp на ToolStripMenuItem.ShortcutKeys?

Ответы [ 2 ]

2 голосов
/ 18 октября 2011

Как оказалось, 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 ключевой модификатор.

2 голосов
/ 18 октября 2011

Как только вы зададите правильный вопрос, вы найдете ответ ....

этот прояснил это для меня: Установка свойства Windows Forms ToolStripMenuItem ShortcutKeys для клавиши numpad не работает

цитата из принятого ответа:
Вы должны использовать Ctrl или Alt в сочетаниях клавиш.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...