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

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;
}

周囲のステートメント(およびそれに伴う重複)を削除し、代わりに3項ステートメントを使用できるようにshiftPressedctrlPressedandboolsを作成しました。これを機能させるには、関数と関数ifからブール値を返す必要があります。これはばかげているように見えるかもしれませんが、常に必要なことを実行できるとは限りません。つまり、グリッドの最下行にいる場合はfalseを返す可能性があります。NextLine()PreviousLine()NextLine()

于 2010-02-04T20:49:54.683 に答える