有更好的方式来处理按键吗?

本文关键字:处理 更好 方式 | 更新日期: 2023-09-27 18:02:38

我的WinForms应用程序中的大多数功能都有按键选项。他们有很多人。目前,我正在处理这个开关语句。我的代码分析器告诉我,这段代码在不同程度上都是不可维护的。我不得不同意。我会将处理代码提取出来单独的方法,但在大多数情况下,这只是一两行,它并不能真正帮助我处理事情.....

是否有更好的方法来处理这个问题,或者我是否被一个巨大的开关卡住了?

Thanks in advance

有更好的方式来处理按键吗?

在代码的某个地方,迟早,您将需要制作swicth/caseif/else,或其他内容。因此,将每个键或键组合的实际处理代码推送到单独的函数中已经是很好的一步了。

你可以做其他"好"的事情:制作一个字典

键:是键盘键

值:委托调用该键

基本上你需要做的就是说,伪代码!!
dictionary[key].Invoke();

希望这将给一些提示。

问候。

您可以使用Dictionary将不同的按键映射到函数,并在结构上有意义的地方添加到Dictionary中。对于一个非常简单的例子:

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"。

或者,您可以拥有多个dictionary,并根据具体情况使用它们,例如用户选项或当前"模式"(取决于您的应用程序的结构)。

使用lambda函数,生成的代码总体上比为每个键定义一个"常规"函数要简洁得多。

您可能还想提出一种简洁的方法来定义映射到键组合(如Ctrl-F10)的函数。您想要走多远取决于应用程序的大小。

实现命令系统(如WPF)

如果你把所有函数的逻辑分离成单独的命令,你可以把这些命令附加到你的菜单项等

看看http://www.ageektrapped.com/blog/using-the-command-pattern-in-windows-forms-clients/

如果您稍微修改该代码以便添加命令。输入字典中其他答案中给出的例子,你就得到了你的答案。

或者,每个命令可以包含一个Form_keydown事件的委托方法,您可以在附加命令时附加该事件,然后您可以分析命令中的按键并选择在匹配时进行处理。