2010-02-04 5 views
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; 
     } 
    } 
} 

것은,이 정말 빠르고, 정말 추한 시작합니다.

코드 개선에 도움이되는 팁이 있습니까?

+0

이것은 특정 문제를 해결하지는 않지만 나중에 문제를 방지 할 수 있습니다. KeyDown 이벤트를 효과적으로 처리 한 경우에만'e.Handled = true'를 설정해야합니다. –

+0

그래, 알아. 그게 효과가 있는지보기위한 시험 일 뿐이야. –

답변

3

IMVHO보기에 국한되어있는 한 당신이하는 일에 너무 많은 문제가 없습니다.

논의 할 수있는 유일한 방법은 주요 상태 테스트를 원활하게하는 방법입니다. 당신이 이것을 구조화하는 방법은 개인적인 취향에 크게 미치지 만, 모든 사람들은 약간 다른 방식을 택할 것입니다. 무한한 else if 문 또는 중복 된 switch 문을 많이 쓰고 싶지는 않지만 처리기를 1000 줄로 길게 만들고 싶지는 않습니다. 다음에 대한

무슨 일이 : 내가 주변 if 문 (그것으로가는 모든 중복)을 제거하고 대신 삼항 문을 사용할 수 있도록

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

은 내가 shiftPressedctrlPressed bools를 만들었습니다. 이 작업을 수행하려면 NextLine()PreviousLine() 함수에서 bool을 반환해야합니다. 바보처럼 보일 수도 있지만 항상 수행 할 수는 없습니다. 즉, NextLine()이 맨 아래 행에 있으면 false를 반환 할 수 있습니다. 그리드.