如何重构这些常用快捷键

本文关键字:常用 快捷键 重构 何重构 | 更新日期: 2023-09-27 17:59:30

在我的.NET应用程序(使用WinForms)的初始开发过程中,我不得不进入并创建常见的编辑快捷方式,如CTRL-A、CTRL-C和CTRL-V,因为它们在默认情况下没有启用。现在,我的应用程序已经发展到相当多的文本框,我正试图弄清楚如何重构以下代码。有人能帮忙吗?

private void textBox1_results_KeyDown(object sender, KeyEventArgs e)
{
    if (e.Control && e.KeyCode == Keys.A)
    {
        textBox1_results.SelectAll();
        e.SuppressKeyPress = true;
    }
    if (e.Control && e.KeyCode == Keys.C)
    {
        textBox1_results.Copy();
        e.SuppressKeyPress = true;
    }
    if (e.Control && e.KeyCode == Keys.V)
    {
        textBox1_results.Text = Clipboard.GetText();
        e.SuppressKeyPress = true;
    }
}

如何重构这些常用快捷键

如果您有一个BaseForm,您的所有表单都从中继承,请尝试将上面的代码移动到它,并从所有文本框事件处理程序中调用它。

public partial class Form2 : Form1
{
    public Form2()
    {
        InitializeComponent();
    }
    private void Form2_Load(object sender, EventArgs e)
    {
    }
    private void textBox1_KeyDown(object sender, KeyEventArgs e)
    {
        base.TextKeyDown(sender, e);
    }
}

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }
    public void TextKeyDown(object sender, KeyEventArgs e)
    {
        if (e.Control && e.KeyCode == Keys.A)
        {
            ((TextBox) sender).SelectAll();
            e.SuppressKeyPress = true;
        }
        if (e.Control && e.KeyCode == Keys.C)
        {
            ((TextBox)sender).Copy();
            e.SuppressKeyPress = true;
        }
        if (e.Control && e.KeyCode == Keys.V)
        {
            ((TextBox)sender).Text = Clipboard.GetText();
            e.SuppressKeyPress = true;
        }
    }

}

有两种主要的方法。

  1. 通过从System.Windows.Forms.TextBox继承并在启用快捷键的情况下添加自己的KeyDown实现(仍在调用base.KeyDown())来创建自己的文本框控件
  2. 创建一个助手类,您可以在每个表单的Load中调用该类,即使该类遍历表单上的所有控件并向代码中添加一个处理程序

备选方案1大概是这样的;

public class ShortcutTextBox : TextBox
{
    protected override void OnKeyDown(KeyEventArgs e)
    {
        if (e.Control && e.KeyCode == Keys.A)
        {
            SelectAll();
            e.SuppressKeyPress = true;
        }
        else if (e.Control && e.KeyCode == Keys.C)
        {
            Copy();
            e.SuppressKeyPress = true;
        }
        else if (e.Control && e.KeyCode == Keys.V)
        {
            Text = Clipboard.GetText();
            e.SuppressKeyPress = true;
        }
        base.OnKeyDown(e);
    }
}

尽管这附带了一个警告,即您需要用ShortcutTextBox替换TextBox的每个实例。

选项二仍然涉及重构,但它是每个表单一次的选项。创建一个助手类,如下所示;

public abstract class ControlUtilities
{
    public static void AddTextBoxShortcuts(Control.ControlCollection controls)
    {
        foreach (Control c in controls)
        {
            if (c is TextBox)
            {
                TextBox txt = (TextBox)c;
                txt.KeyDown += textBox_KeyDown;
            }
            else if (c.Controls != null && c.Controls.Count > 0)
            {
                // recursively look for text boxes
                AddTextBoxShortcuts(c.Controls);
            }
        }
    }
    private static void textBox_KeyDown(object sender, KeyEventArgs e)
    {
        TextBox txt = (TextBox)sender;
        if (e.Control && e.KeyCode == Keys.A)
        {
            txt.SelectAll();
            e.SuppressKeyPress = true;
        }
        else if (e.Control && e.KeyCode == Keys.C)
        {
            txt.Copy();
            e.SuppressKeyPress = true;
        }
        else if (e.Control && e.KeyCode == Keys.V)
        {
            txt.Text = Clipboard.GetText();
            e.SuppressKeyPress = true;
        }
    }
}

并在表单的Load事件中调用它,如;

private void Form1_Load(object sender, EventArgs e)
{
    ControlUtilities.AddTextBoxShortcuts(this.Controls);
}

可能是这样的:

private static void Shortcut_KeyDown(object sender, KeyEventArgs e)
{
    var textBox = (TextBox)sender;
    if (e.Control && e.KeyCode == Keys.A)
    {
        textBox.SelectAll();
        e.SuppressKeyPress = true;
    }
    if (e.Control && e.KeyCode == Keys.C)
    {
        textBox.Copy();
        e.SuppressKeyPress = true;
    }
    if (e.Control && e.KeyCode == Keys.V)
    {
        textBox.Text = Clipboard.GetText();
        e.SuppressKeyPress = true;
    }
}

并应用它:

textBox1.KeyDown += Shortcut_KeyDown;
textBox2.KeyDown += Shortcut_KeyDown;
// etc...

虽然我不知道你为什么需要写这个——但据我所知,这种行为是Winforms TextBox的标准行为。