2010-02-04 111 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」。 – 2010-02-04 20:36:01

+0

是的,我知道,這只是一個測試,看它是否會起作用。 – 2010-02-04 20:36:31

回答

3

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

我創建了shiftPressedctrlPressed布爾變量,這樣我可以消除周圍if陳述(和與它去任何重複),並使用三元語句。爲了達到這個目的,你需要從NextLine()PreviousLine()函數中返回一個bool - 這可能看起來很愚蠢,但它們可能並不總是能夠做到他們應該做的,例如,如果你在最下面一行,NextLine()可以返回false格。