Хороший дизайн клавиш - PullRequest
       8

Хороший дизайн клавиш

2 голосов
/ 04 февраля 2010

Я недавно начал использовать 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 Ответ

3 голосов
/ 04 февраля 2010

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 bools, чтобы я мог исключить окружающий оператор if (и любое дублирование, которое сопровождает его) и использовать вместо него троичный оператор. Чтобы это работало, вам нужно будет вернуть bool из ваших функций NextLine() и PreviousLine() - это может показаться глупым, но они не всегда могут делать то, что должны, т.е. NextLine() может возвращать false, если в нижнем ряду сетки.

...