Есть ли лучший способ обрабатывать нажатия клавиш? - PullRequest
0 голосов
/ 15 июля 2011

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

Есть ли лучший способсправиться с этим, я застрял с огромным переключателем?

Ответы [ 3 ]

5 голосов
/ 15 июля 2011

Где-то в коде рано или поздно вам нужно будет сделать swicth/case или if/else, или что-то еще.Таким образом, вставка действительного кода обработки для каждой клавиши или комбинации клавиш в отдельную функцию уже является хорошим шагом.

Вы можете быть и другими "хорошими" вещами: создать словарь, в котором

Клавиша: это клавиша клавиатуры

Значение: делегат для вызова этой клавиши нажмите

И в основном вам нужно будет сказать: псевдокод !!

dictionary[key].Invoke();

Надеюсь, что это даст некоторые советы.

С уважением.

2 голосов
/ 15 июля 2011

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

public partial class Form1 : Form
{
    Dictionary<Keys, Action<object, KeyEventArgs>> KeyPressLookup;

    public Form1()
    {
        KeyPressLookup = new Dictionary<Keys, Action<object, KeyEventArgs>>();
        KeyPressLookup[Keys.F10] = (o, e) => MessageBox.Show("You pressed F10");

        InitializeComponent();
    }

    private void Form1_KeyDown(object sender, KeyEventArgs e)
    {
        if(KeyPressLookup.ContainsKey(e.KeyCode) // Could use TryGetValue instead
            KeyPressLookup[e.KeyCode](sender, e);
    }
}

Этот код ограничен тем, что клавише может быть назначена только одна функция, которая может быть хорошей или плохой. Конечно, вы можете создать словарь списков или «MultiDictionary», если вам нужно несколько функций для каждой клавиши.

В качестве альтернативы, вы можете иметь несколько словарей и использовать их в зависимости от обстоятельств, таких как пользовательские параметры или текущий «режим» (в зависимости от структуры вашего приложения).

Используя лямбда-функции, результирующий код в целом может быть гораздо более кратким, чем определение «обычной» функции для каждой клавиши.

Возможно, вы также захотите придумать краткий способ определения функций, отображаемых на комбинации клавиш, например Ctrl-F10. Как далеко вы хотите зайти, будет зависеть от размера вашего приложения.

1 голос
/ 15 июля 2011

Реализация системы команд (например, WPF).

Если вы разделите логику всех ваших функций на отдельные команды, вы можете затем присоединить эти команды к своим пунктам меню и т. Д.на http://www.ageektrapped.com/blog/using-the-command-pattern-in-windows-forms-clients/

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

В качестве альтернативы каждая команда может содержать метод-делегат для события Form_keydown, которое вы присоединяете, когда присоединяете команду, и затем вы можете анализировать нажатие клавиши в команде и выбирать обработку, если она совпадает.

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