如何重构这些常用快捷键
本文关键字:常用 快捷键 重构 何重构 | 更新日期: 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;
}
}
}
有两种主要的方法。
- 通过从System.Windows.Forms.TextBox继承并在启用快捷键的情况下添加自己的KeyDown实现(仍在调用base.KeyDown())来创建自己的文本框控件
- 创建一个助手类,您可以在每个表单的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的标准行为。