好吧,有两种主要方法。
- 通过从 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);
}