我最近开始使用 WPF 来开发我的应用程序。现在,在组合键处理方面,我需要一些有关良好设计的技巧。
这是我目前正在使用的:
private void Grid_PreviewKeyDown(object sender, KeyEventArgs e)
{
if (Keyboard.Modifiers == ModifierKeys.Control)
{
switch (e.Key)
{
case Key.Up: PreviousLine(); break;
case Key.Down: NextLine(); break;
case Key.Return: NextLine(); break;
}
}
else if (Keyboard.Modifiers == ModifierKeys.Shift)
{
switch (e.Key)
{
case Key.Return: PreviousLine(); break;
}
}
}
正如你所想象的,这将开始变得非常丑陋,非常快。
您有什么可以改进代码的技巧吗?
最佳答案
IMVHO 只要仅限于 View ,您所做的事情就没有太大问题。
唯一需要讨论的是如何平滑关键状态的测试。如何构建它很大程度上取决于个人喜好,每个人都会有稍微不同的看法。尽管您不希望无休止的 else if
语句或大量重复的 switch
语句,并且您也不希望处理程序有 1000 行长。
以下怎么样:
private void Grid_PreviewKeyDown(object sender, KeyEventArgs e)
{
bool shiftPressed = Keyboard.Modifiers == ModifierKeys.Shift;
bool ctrlPressed = Keyboard.Modifiers == ModifierKeys.Control;
switch (e.Key)
{
case Key.Up:
e.Handled = ctrlPressed ? PreviousLine() : false;
break;
case Key.Down:
e.Handled = ctrlPressed ? NextLine() : false;
break;
case Key.Return:
e.Handled = ctrlPressed ? NextLine() : shiftPressed ? PreviousLine() : false;
break;
}
e.Handled = false;
}
我创建了 shiftPressed
和 ctrlPressed
bool 值,以便我可以消除周围的 if
语句(以及与之相关的任何重复项),并且请改用三元语句。为此,您需要从 NextLine()
和 PreviousLine()
函数返回一个 bool - 这可能看起来很愚蠢,但它们可能并不总是能够做到他们应该做什么,即如果您位于网格的底行,NextLine()
可能会返回 false。
关于c# - 良好的按键处理设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2202939/