MenuStrip项目或ToolStrip项目在单击或按下其快捷键时不会改变焦点。哪个是实现此功能的凭单,表单的ActiveControl会告诉您哪个控件具有焦点。你只需要检查它是否是一个TextBox。像这样:
private void copyToolStripMenuItem_Click(object sender, EventArgs e) {
var box = this.ActiveControl as TextBoxBase;
if (box != null) box.Copy();
}
对Paste()和Cut()方法做同样的操作。您可以通过订阅Application.Idle事件并检查ActiveControl是否为文本框并且文本框或剪贴板是否包含任何文本来选择性地启用这些菜单/工具栏项目,以进一步增强UI。像这样:
public Form1() {
InitializeComponent();
Application.Idle += Application_Idle;
}
protected override void OnFormClosed(FormClosedEventArgs e) {
Application.Idle -= Application_Idle;
base.OnFormClosed(e);
}
void Application_Idle(object sender, EventArgs e) {
var box = this.ActiveControl as TextBoxBase;
copyToolStripMenuItem.Enabled = box != null && box.Text.Length > 0;
cutToolStripMenuItem.Enabled = copyToolStripMenuItem.Enabled;
pasteToolStripMenuItem.Enabled = box != null && Clipboard.ContainsText();
}
好的,我可以将这些方法传递给方框。谢谢。但首先接受事件的是谁?这是一种泡沫吗?因此,重点项目首先获得控制权,并在稍后将其传递给表单?为什么在TextBox中不再使用默认的Ctrl + X?我相信我们正在处理泡沫破裂。 – Marnix
不,您分配的快捷键使菜单/工具条项目首先获得Click事件。主动控制不会看到它。没有冒泡。通过我发布的代码,Ctrl + X现在将显式调用文本框'Cut()方法。让它像往常一样工作。 –
我觉得很奇怪,需要明确的调用来保持命令的状态。 – Marnix