2014-09-20 19 views
1

重構下面各個按鈕點擊事件的最佳方式是什麼?可能嗎。他們都在做同樣的事情,單獨改變他們每個人都是背後的痛苦。重構多個事件處理程序以使代碼可維護

MainWindow.xaml.cs

 private void Button1_Click(object sender, RoutedEventArgs e) 
     { 
      Button1_Add(); 
     } 

     private void Button1_Add() 
     { 
      var tb = Keyboard.FocusedElement as TextBox; 
      try 
      { 
       var keypadObject = new Keypad(); 
       keypadObject.AppendValue(tb, Button1.Content.ToString()); 
      } 
      catch (Exception) 
      { 
       TotalTextBox.Focus(); 
      } 
     } 

     private void Button2_Click(object sender, RoutedEventArgs e) 
     { 
      Button2_Add(); 
     } 

     private void Button2_Add() 
     { 
      var tb = Keyboard.FocusedElement as TextBox; 
      try 
      { 
       var keypadObject = new Keypad(); 
       keypadObject.AppendValue(tb, Button2.Content.ToString()); 
      } 
      catch (Exception) 
      { 
       TotalTextBox.Focus(); 
      } 
     } 

     private void Button3_Click(object sender, RoutedEventArgs e) 
     { 
      Button3_Add(); 
     } 

     private void Button3_Add() 
     { 
      var tb = Keyboard.FocusedElement as TextBox; 
      try 
      { 
       var keypadObject = new Keypad(); 
       keypadObject.AppendValue(tb, Button3.Content.ToString()); 
      } 
      catch (Exception) 
      { 
       TotalTextBox.Focus(); 
      } 
     } 

     private void Button4_Click(object sender, RoutedEventArgs e) 
     { 
      Button4_Add(); 
     } 

     private void Button4_Add() 
     { 
      var tb = Keyboard.FocusedElement as TextBox; 
      try 
      { 
       var keypadObject = new Keypad(); 
       keypadObject.AppendValue(tb, Button4.Content.ToString()); 
      } 
      catch (Exception) 
      { 
       TotalTextBox.Focus(); 
      } 
     } 

     private void Button5_Click(object sender, RoutedEventArgs e) 
     { 
      Button5_Add(); 
     } 

     private void Button5_Add() 
     { 
      var tb = Keyboard.FocusedElement as TextBox; 
      try 
      { 
       var keypadObject = new Keypad(); 
       keypadObject.AppendValue(tb, Button5.Content.ToString()); 
      } 
      catch (Exception) 
      { 
       TotalTextBox.Focus(); 
      } 
     } 

     private void Button6_Click(object sender, RoutedEventArgs e) 
     { 
      Button6_Add(); 
     } 

     private void Button6_Add() 
     { 
      var tb = Keyboard.FocusedElement as TextBox; 
      try 
      { 
       var keypadObject = new Keypad(); 
       keypadObject.AppendValue(tb, Button6.Content.ToString()); 
      } 
      catch (Exception) 
      { 
       TotalTextBox.Focus(); 
      } 
     } 

     private void Button7_Click(object sender, RoutedEventArgs e) 
     { 
      Button7_Add(); 
     } 

     private void Button7_Add() 
     { 
      var tb = Keyboard.FocusedElement as TextBox; 
      try 
      { 
       var keypadObject = new Keypad(); 
       keypadObject.AppendValue(tb, Button7.Content.ToString()); 
      } 
      catch (Exception) 
      { 
       TotalTextBox.Focus(); 
      } 
     } 

     private void Button8_Click(object sender, RoutedEventArgs e) 
     { 
      Button8_Add(); 
     } 

     private void Button8_Add() 
     { 
      var tb = Keyboard.FocusedElement as TextBox; 
      try 
      { 
       var keypadObject = new Keypad(); 
       keypadObject.AppendValue(tb, Button8.Content.ToString()); 
      } 
      catch (Exception) 
      { 
       TotalTextBox.Focus(); 
      } 
     } 

     private void Button9_Click(object sender, RoutedEventArgs e) 
     { 
      Button9_Add(); 
     } 

     private void Button9_Add() 
     { 
      var tb = Keyboard.FocusedElement as TextBox; 
      try 
      { 
       var keypadObject = new Keypad(); 
       keypadObject.AppendValue(tb, Button9.Content.ToString()); 
      } 
      catch (Exception) 
      { 
       TotalTextBox.Focus(); 
      } 
     } 

     private void Button0_Click(object sender, RoutedEventArgs e) 
     { 
      Button0_Add(); 
     } 

     private void Button0_Add() 
     { 
      var tb = Keyboard.FocusedElement as TextBox; 
      try 
      { 
       var keypadObject = new Keypad(); 
       keypadObject.AppendValue(tb, Button0.Content.ToString()); 
      } 
      catch (Exception) 
      { 
       TotalTextBox.Focus(); 
      } 
     } 

Keypad.cs

public void AppendValue(TextBox tb, string valueToAppend) 
    { 
     if (tb.Text.Length < 6 && tb.Name != "RemainingTextBox") 
     { 
      if (tb.Text.IndexOf(".") == -1) 
      { 
       int beforeDotLength = tb.Text.Length; 
       if (beforeDotLength < 3) 
       { 
        tb.AppendText(valueToAppend); 
       } 
      } 
      else if (tb.Text.IndexOf(".") > -1) 
      { 
       int dotPosition = tb.Text.IndexOf("."); 
       int afterDotLength = tb.Text.Substring(dotPosition).Length; 
       if (afterDotLength < 3) 
       { 
        tb.AppendText(valueToAppend); 
       } 
      } 
     } 
    } 

回答

1

您可以從senderparameter獲取當前點擊的按鈕,因爲它是currently clicked button,只需將其轉換爲(Button)

private void Button_Add_Click(object sender, RoutedEventArgs e) 
    { 
     Button_Add((Button)sender); 
    } 

    private void Button_Add(Button button) 
    { 
     var tb = Keyboard.FocusedElement as TextBox; 
     try 
     { 
      var keypadObject = new Keypad(); 
      keypadObject.AppendValue(tb, button.Content.ToString()); 
     } 
     catch (Exception) 
     { 
      TotalTextBox.Focus(); 
     } 
    } 

然後使用Button_Add_Click作爲所有按鈕的事件處理程序。如果你在錯誤的(不是按鈕)處理使用它,

P.S:(Button)sender投可能會失敗,所以你應該對這樣的場景準備(catch異常 - 通知用戶或者至少數)。
P.P.S:考慮到這是WPF應用程序,您可能需要考慮使用MVVM design pattern。它具有陡峭的學習曲線,並且可能起初看起來太複雜以至於沒有多少優勢,但它可以讓您創建更強大,更少耦合的應用程序。

+0

這很好。謝謝! – methuselah 2014-09-20 17:08:56

相關問題