Um bom design de manipulação de chave
-
18-09-2019 - |
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?
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.