Как запретить пользователю управлять формой ввода с клавиатуры (клавиши со стрелками) в c # - PullRequest
3 голосов
/ 30 мая 2011

мой usercontrol содержит другие элементы управления, которые можно выбрать, я хотел бы реализовать способ навигации по дочерним элементам управления с помощью клавиш со стрелками

Проблема в том, что родительский элемент управления перехватывает клавиши со стрелками и использует его для прокрутки своего представления, чего я хочу избежать. Я хочу решить навигацию по содержимому элемента управления самостоятельно.

Как я могу взять под контроль стандартное поведение, которое вызывается клавишами со стрелками?

Спасибо заранее MTH

Ответы [ 2 ]

4 голосов
/ 30 мая 2011

Обычно это делается переопределением метода IsInputKey (), чтобы сообщить, что вам нужны эти ключи. Однако это не сработает для UserControl, он никогда не получает фокус, поэтому метод OnKeyDown никогда не запускается. Вместо этого переопределите метод ProcessCmdKey (), он вызывается до того, как форма увидит нажатие клавиши. Как это:

    protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
        switch (keyData) {
            case Keys.Left: MessageBox.Show("Left!"); break;
            case Keys.Right: MessageBox.Show("Right!"); break;
            default: return base.ProcessCmdKey(ref msg, keyData);
        }
        return true;  // used
    }
3 голосов
/ 30 мая 2011

Вы можете переопределить OnKeyDown в своем пользовательском элементе управления, но это не работает для клавиш со стрелками, потому что они не являются «клавишами ввода» (они являются клавишами навигации).

Чтобы изменить поведение, переопределите IsInputKey (), чтобы сообщить системе, что вы хотите получать события для клавиш со стрелками:

    protected override bool IsInputKey(Keys keyData)
    {
        bool result = false;

        Keys key = keyData & Keys.KeyCode;

        switch (key)
        {
            case Keys.Up:
            case Keys.Down:
            case Keys.Right:
            case Keys.Left:
                result = true;
                break;

            default:
                result = base.IsInputKey(keyData);
                break;
        }

        return result;
    }
...