С# назначить кнопку через ComboBox для элемента

199
27 декабря 2017, 18:08

Здравствуйте, кто может подсказать и показать примерами как бы в роде простую задачку?

Есть три ComboBox на 4 пункта:

  1. Пункт None
  2. Пункт Caps Lock
  3. Пункт Num Lock
  4. Пункт Scroll Lock

и есть три индикатора для каждой кнопки.

Нужно сделать так: если человек выбирает в ComboBox для первого индикатора клавишу, например Num Lock , тогда первый индикатор будет реагировать только на клавишу Num Lock , а если человек выбирает клавишу Caps Lock - значить индикатор будет реагировать только на клавишу Caps Lock , и так далее для остальных 2-х индикаторов и ComboBox.

Answer 1
  1. Перед тем как выполнить соответствие (в вашем случае - нужно каждому индикатору поставить в соответствие состояние клавиши), необходимо продумать архитектуру. Предлагаю внести в проект класс для одного индикатора.

    public class LedItem {
        public const int NULL        = 0x00;
        public const int CAPS_LOCK   = 0x01;
        public const int NUM_LOCK    = 0x02;
        public const int SCROLL_LOCK = 0x03;
        private int index;
        private int keyCode;
        public LedItem(int index, int keyCode) {
            this.index = index;
            this.keyCode = keyCode;
        }
        public int Index {
            get {
                return this.index;
            }
        }
        public int KeyCode {
            get {
                return this.keyCode;
            }
            set {
                this.keyCode = value;
            }
        }
    }
    
  2. Перед тем как что то выбирать, на старте проекта необходимо сформировать наши индикаторы, например:

    private LedItem led1 = new LedItem(0, LedItem.NULL);
    
  3. Вешаем слушателя на ComboBox:

        int select = cmbButtonState.SelectedIndex;
        switch (select) {
            case 0:
                led1.KeyCode = LedItem.NULL;
                break;
            case 1:
                led1.KeyCode = LedItem.CAPS_LOCK;
                break;
            case 2:
                led1.KeyCode = LedItem.NUM_LOCK;
                break;
            case 3:
                led1.KeyCode = LedItem.SCROLL_LOCK;
                break;
        }
    

Слушатель меняет клавишу, за которой следит индикатор. Всё довольно просто.

  1. Рисуем результат относительно статусов индикаторов, для этого, можно добавить таймер (если это UI поток), или Thread:

        private void tmrThread_Tick(object sender, EventArgs e) {
            switch (led1.KeyCode) {
                case LedItem.NULL:
                    chkLed.Checked = false;
                    break;
                case LedItem.CAPS_LOCK:
                    chkLed.Checked = KeyService.CapsLockState;
                    break;
                case LedItem.NUM_LOCK:
                    chkLed.Checked = KeyService.NumLockState;
                    break;
                case LedItem.SCROLL_LOCK:
                    chkLed.Checked = KeyService.ScrollLockState;
                    break;
            }
        }
    

Для полноты картины прикрепляю исходник проекта. Ссылка на архив

Если вы знакомы с делегатами, я могу намекнуть на то что от switch конструкций можно избавиться) Если не знакомы, можете оставлять всё как есть. Для того чтобы добавить ещё два индикатора, не надо лепить led2, led3... и т.д., достаточно собрать коллекцию List и проходить по ней, индекс индикатора будет в led.Index, код клавиши за которой он следит - led.KeyCode

READ ALSO
Task скачивания файла

Task скачивания файла

Запутался в одном вопросе, просьба знающих помочьПри открытии формы проверяю, существует ли на жёстком диске файл

204
c# [DllImport] в методе, функция из dll без обьявления

c# [DllImport] в методе, функция из dll без обьявления

Можно ли как-то в c# в самом методе подключить функцию из dll ? То есть, подобную конструкцию засунуть в метод (например метод Main):

189
GridContol Devexpress WPF MVVM [требует правки]

GridContol Devexpress WPF MVVM [требует правки]

I have many data from observable collection, the data in back end loaded asynchronousThe pattern is MVVM WPF

230
Лямбда-выражение

Лямбда-выражение

Рихтер пишет, что такое выражение:

191