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, если в нижнем ряду сетки.