2011-07-15 2 views
0

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

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

Заранее спасибо

+0

Какое приложение это? Консоль, Windows Forms, WPF? ... –

+0

Извините, это WinForms – ScruffyDuck

ответ

5

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

Вы можете быть может другой «хороший» материал: сделать словарь, где

Ключ: есть клавиатура ключ

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

И в основном то, что вам нужно сделать, так сказать, псевдокод !!

dictionary[key].Invoke(); 

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

С уважением.

+0

+1 Это именно то, о чем я думал, несмотря на то, что раньше не видел и не использовал его. Хороший звонок. – Tesserex

+0

Это такой подход, который вы предлагаете? http://www.codeproject.com/KB/dotnet/DynamicMethodDispatcher.aspx?fid=1629979&fr=26#xx0xx – ScruffyDuck

+0

@ScruffyDuck У вас нет времени на чтение целой статьи, но из предварительного просмотра кажется очень похожим, да. – Tigran

2

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

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

Внедрение системы команд (например, WPF).

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

взглянуть на http://www.ageektrapped.com/blog/using-the-command-pattern-in-windows-forms-clients/

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

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

Смежные вопросы