我的WinForms应用程序中的大多数功能都有按键替代方案。有很多。目前我在switch语句中处理这个问题。我的代码分析器告诉我,这段代码不可维护到不同程度的讨厌。我必须同意。我会将处理代码提取出来以分离方法,但在大多数情况下,这只是一两行,它并没有真正帮助我处理事情......
有没有更好的方法来解决这个问题?我是否坚持使用巨大的开关?
提前致谢
答案 0 :(得分:5)
代码中的某个地方,不久之后,您需要制作swicth/case
或if/else
,或其他任何内容。因此,将每个Key或Key组合的实际处理代码推送到单独的功能已经是很好的一步。
你可能可以使用其他“好”的东西:制作字典
键:键盘键
值:委托按下该键按
基本上你需要做的就是说,伪代码!!
dictionary[key].Invoke();
希望这会给出一些提示。
问候。
答案 1 :(得分: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”。
或者,您可以拥有多个词典,并根据具体情况使用它们,例如用户选项或当前“模式”(取决于您的应用程序的结构)。
使用lambda函数,整体生成的代码比为每个键定义“常规”函数要简洁得多。
您可能还想提供一种简洁的方法来定义映射到键组合的函数,例如Ctrl-F10。您想走多远取决于您的应用程序的大小。
答案 2 :(得分:1)
实施命令系统(如WPF)。
如果您将所有功能的逻辑分成单独的命令,则可以将这些命令附加到菜单项等
看看http://www.ageektrapped.com/blog/using-the-command-pattern-in-windows-forms-clients/
如果您稍微修改该代码,以便将command.Key添加到其他答案中给出的Dictionary示例中,您将获得解决方案。
或者,每个Command都可以包含附加命令时附加的Form_keydown事件的委托方法,然后您可以分析命令中的按键并选择处理它是否匹配。