重构下面各个按钮点击事件的最佳方法是什么?可能吗。他们都做同样的事情,单独改变他们每个人都是背后的痛苦。
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);
}
}
}
}
答案 0 :(得分:1)
您可以从sender
parameter获取当前点击的按钮,因为它是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
作为所有按钮的事件处理程序。
PS: (Button)sender
强制转换如果您在错误的(非Button)处理程序中使用它可能会失败,因此您应该为此类情况做好准备(捕获异常 - 通知用户或至少记录日志)。
P.P.S:考虑到它是WPF应用程序,您可能需要考虑使用MVVM design pattern。它具有陡峭的学习曲线,起初可能看起来过于复杂而没有最小的优势,但它可以让您创建更强大,更少耦合的应用程序。