Pergunta

Eu recentemente comecei a usar WPF para o desenvolvimento de minhas aplicações. Agora eu chegar a um ponto onde eu preciso de algumas dicas sobre um bom design quando se trata de manipulação de combinação de teclas.

Isto é o que eu estou usando no momento:

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

Como você pode imaginar, isso vai começar a ficar realmente feio, muito rápido.

Você tem alguma dica que poderiam melhorar o código?

Foi útil?

Solução

IMVHO não há nada de muito errado com o que você está fazendo, enquanto ele está confinado à View.

A única coisa a discutir é a forma de suavizar o teste de estados-chave. Como você estrutura isso é em grande parte sobre a preferência pessoal, todo mundo vai ter uma visão um pouco diferente sobre ele. Embora você não quer declarações else if intermináveis, ou lotes de declarações switch duplicados, e você não quer que o manipulador a ser 1000 linhas longas.

E o seguinte:

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

Eu criei os bools shiftPressed e ctrlPressed para que eu pudesse eliminar a declaração if circundante (e qualquer duplicação que vai com ele) e usar a instrução ternário vez. Para que isso funcione, você precisará retornar um bool de suas funções NextLine() e PreviousLine() - que pode parecer estúpido, mas eles podem não ser sempre capaz de fazer o que deveriam, ou seja NextLine() pode retornar false se você estiver na linha inferior do grade.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top