c# - 良好的按键处理设计

标签 c# wpf keyboard-events

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

我创建了 shiftPressedctrlPressed bool 值,以便我可以消除周围的 if 语句(以及与之相关的任何重复项),并且请改用三元语句。为此,您需要从 NextLine()PreviousLine() 函数返回一个 bool - 这可能看起来很愚蠢,但它们可能并不总是能够做到他们应该做什么,即如果您位于网格的底行,NextLine() 可能会返回 false。

关于c# - 良好的按键处理设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2202939/

相关文章:

python - QDoubleSpinBox “backspace”键的编辑行为

c++ - 使用Qt识别数字键盘上的中心键(关闭numlock)

时间:2019-03-17 标签:c#mysql获取所有行

.net - .net 的桌面多线程 UI 示例应用程序

c# - 本地 IIS Express 上的 ASP.NET 应用程序使用事件目录对用户进行身份验证

wpf - 组合框以两种方式绑定(bind)到所选项目

c# - 在 WPF 控件上显示 'loading' 指示符的最佳方法是什么

javascript - `propertychange` - 不与事件绑定(bind) - 如何克服这个问题?

C#:更改按钮背景颜色无效

c# - Web API 2.2,有没有一种简单的方法可以在 DelegatingHandler 中更新 HttpRequestMessage 的 QueryString?