代码之家  ›  专栏  ›  技术社区  ›  Deniz Dogan

良好的钥匙操作设计

  •  2
  • Deniz Dogan  · 技术社区  · 15 年前

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

    正如你所能想象的,这将开始变得非常丑陋,非常迅速。

    您有什么可以改进代码的提示吗?

    1 回复  |  直到 7 年前
        1
  •  3
  •   Noctis    7 年前

    imvho你所做的没有太大的错误,只要它局限在视野之内。

    唯一要讨论的是如何顺利完成关键状态的测试。你如何组织这在很大程度上取决于个人喜好,每个人对它的看法都会略有不同。尽管你不想无穷无尽 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 为了消除周围环境 if 语句(以及与之配套的任何重复语句)并改用三元语句。为了让这个工作,你需要从你的 NextLine() PreviousLine() 功能-这可能看起来很愚蠢,但他们可能不总是能够做他们应该做的,即。 下一行() 如果位于网格的底行,则返回false。