重构多个事件处理程序以使代码可维护

时间:2014-09-20 16:19:18

标签: c# wpf

重构下面各个按钮点击事件的最佳方法是什么?可能吗。他们都做同样的事情,单独改变他们每个人都是背后的痛苦。

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 个答案:

答案 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。它具有陡峭的学习曲线,起初可能看起来过于复杂而没有最小的优势,但它可以让您创建更强大,更少耦合的应用程序。