2

我最近开始使用 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;
        }
    }
}

正如你可以想象的那样,这将开始变得非常丑陋,非常快。

你有什么可以改进代码的技巧吗?

4

1 回答 1

3

恕我直言,您所做的事情并没有什么太大的问题,只要它仅限于视图即可。

唯一要讨论的是如何平滑关键状态的测试。您如何构建这在很大程度上取决于个人喜好,每个人都会对此略有不同。尽管您不想要无休止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;
}

我创建了shiftPressedand ctrlPressedbools,这样我就可以消除周围的if语句(以及与之相关的任何重复)并改用三元语句。为此,您需要从您的NextLine()PreviousLine()函数中返回一个布尔值——这可能看起来很愚蠢,但它们可能并不总是能够做他们应该做的事情,即NextLine()如果您在网格的底行,则可以返回 false。

于 2010-02-04T20:49:54.683 回答