Как изменить фокус на кнопках вверх, вниз, влево и вправо относительно выбранной кнопки? - PullRequest
2 голосов
/ 09 января 2020

Я новичок в программировании.

Я не знаю, как хорошо объяснить !!.

Как я могу заставить мое приложение WinForms понимать расположение кнопок, например, представить себе количество расположенных кнопок и одно из них:

button1- button2-кнопка3

button4- (button5) -button6

button7 -button8- button9

как я могу нажать на клавиатуре и перейти к (кнопка8), а не к (кнопка6) или нажать клавишу вверх и go из (кнопка2). Как я могу заставить Visual Studio понять, какая кнопка вверх или вниз или влево и вправо относительно выбранной кнопки?

Ответы [ 2 ]

2 голосов
/ 09 января 2020

Вы можете добавить свои кнопки к TableLayoutPanel , поэтому положение каждой кнопки определяется координатами TableLayoutPanel (Column:Row).

  • Создайте TableLayoutPanel (в дальнейшем, с именем tlpButtons) с достаточным количеством строк и столбцов для размещения ваших кнопок. При необходимости вы можете добавлять / удалять строки и столбцы во время выполнения.
  • Выберите все свои кнопки и подпишитесь на PreviewKeyDown , используя PropertyGrid в конструкторе форм, чтобы у вас был только один обработчик событий для всех ваших кнопок (в этом коде обработчик событий назван buttons_PreviewKeyDown).
  • При нажатии Key.Up или Keys.Down вызывается обработчик кнопок PreviewKeyDown. Аргумент отправителя ссылается на элемент управления, который вызвал событие, поэтому мы приводим sender к Control (поскольку требуется только ссылка на тип элемента управления, мы не используем какое-либо свойство, определяющее c для производного типа, например Button)
  • Если мы обрабатываем нажатую клавишу, мы должны установить IsInputKey , в противном случае событие передается в элемент управления и обрабатывается (вызывая запуск обычного выбора)
  • TableLayoutPanel GetPositionFromControl () возвращает позицию строки / столбца этого элемента управления.
  • Мы просто устанавливаем значение строки ± 1, в зависимости от того, какая клавиша курсора была нажата (при проверке, находится ли новое значение в диапазоне [0 : RowsCount]).
    GetControlFromPosition () Метод возвращает ссылку на элемент управления в новой позиции: мы используем эту ссылку для установки текущего ActiveControl .

Это результат:

Button PreviewKeyDown


Примечание:
* buttons_PreviewKeyDown обработчик событий одинаков для всех кнопок / элементов управления.
tlpButtons - это имя TableLayoutControl, используемого в качестве контейнера для кнопок / элементов управления

private void buttons_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
    var btn = sender as Control;
    var pos = tlpButtons.GetPositionFromControl(btn);
    bool moveFocus = false;
    switch (e.KeyCode) {
        case Keys.Up:
            pos.Row = (pos.Row > 0) ? pos.Row - 1 : tlpButtons.RowCount - 1;
            moveFocus = true;
            break;
        case Keys.Down:
            pos.Row = (pos.Row < (tlpButtons.RowCount - 1)) ? pos.Row + 1 : 0;
            moveFocus = true;
            break;
    }
    if (moveFocus) {
        e.IsInputKey = true;
        var ctrl = tlpButtons.GetControlFromPosition(pos.Column, pos.Row);
        if (ctrl != null) this.ActiveControl = ctrl;
    }
}
1 голос
/ 09 января 2020

Я предполагаю, что вы говорите о кнопках в Форме.

Поместите их в такой список

List<Button> buttons = new List<Button>() {Button1, Button2...}

Теперь вы знаете, на какую кнопку вы переходите и что означает повышение вам нужно взять текущий индекс и вычесть из него 3 * (Button6 -> Button3) и просто использовать его в качестве нового индекса для списка. Для понижения вы добавляете 3 *, а влево / вправо - минус / плюс 1.

Теперь вам просто нужно определить свои крайние случаи: что если вы нажмете вниз или вправо, когда находитесь на Button9 ?

* Это значение изменяется в зависимости от количества столбцов. 3 столбца => +/- 3; 4 цв => +/- 4

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