C# 使快捷方式显示在多个菜单中
我正在创建的自定义C# 使快捷方式显示在多个菜单中,c#,winforms,.net-4.0,C#,Winforms,.net 4.0,我正在创建的自定义用户控件中使用文本框。默认的上下文菜单似乎没有显示剪切、复制和粘贴的快捷方式。这很好,只要他们还在工作 但是我的表单使用UserControl有一个MenuStrip,其中也包含这些默认快捷方式。但是剪切、复制和粘贴命令不再起作用,因为快捷方式已分配给菜单提示 如何在表单中的多个位置使用快捷方式?传递全局命令(如Cut)并将其深入发布到我的UserControl中的最佳方式是什么?是否可以将快捷方式添加到文本框的默认上下文菜单中?您只需为相同的文本框启用属性,它就会开始响应 只
用户控件中使用文本框
。默认的上下文菜单似乎没有显示剪切、复制和粘贴的快捷方式。这很好,只要他们还在工作
但是我的表单
使用UserControl
有一个MenuStrip
,其中也包含这些默认快捷方式。但是剪切、复制和粘贴命令不再起作用,因为快捷方式已分配给菜单提示
如何在表单中的多个位置使用快捷方式?传递全局命令(如Cut)并将其深入发布到我的UserControl
中的最佳方式是什么?是否可以将快捷方式添加到文本框的默认上下文菜单中?您只需为相同的文本框启用属性,它就会开始响应
只需验证=正确 单击MenuStrip项或ToolStrip项或按其快捷键时不会更改焦点。哪个是实现此功能的票证,窗体的ActiveControl会告诉您哪个控件具有焦点。你只需要检查它是否是一个文本框。像这样:
private void copyToolStripMenuItem_Click(object sender, EventArgs e) {
var box = this.ActiveControl as TextBoxBase;
if (box != null) box.Copy();
}
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();
}
对Paste()和Cut()方法执行相同的操作。通过订阅Application.Idle事件并检查ActiveControl是否为文本框以及文本框或剪贴板是否包含任何文本,可以有选择地启用这些菜单/工具栏项,从而进一步增强UI。像这样:
private void copyToolStripMenuItem_Click(object sender, EventArgs e) {
var box = this.ActiveControl as TextBoxBase;
if (box != null) box.Copy();
}
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();
}
ShortcutsEnabled已设置为true。“全选”功能正常,但“剪切”“复制”和“粘贴”功能不正常。我想它们被主菜单取代了。但是,对于全选,菜单项中没有快捷方式:“CTRL+A
Ok”当然,我可以将这些方法传递到框中。谢谢但谁是最先接收事件的人?这是一种冒泡的方式吗?那么聚焦项首先获得控件,然后将其传递给表单?为什么默认的Ctrl+X在文本框中不再起作用?我相信我们正在处理气泡下降。不,您指定的快捷键使菜单/工具条项首先获得单击事件。活动控件将看不到它。不要冒泡。在我发布的代码中,Ctrl+X现在将显式调用文本框“Cut()方法”。让它像往常一样工作。我觉得奇怪的是,需要显式调用才能保持命令的状态。好吧,不要重新指定Ctrl+X快捷键,你也不必这样做。如果不将Ctrl+X快捷键重新指定给菜单条,你如何在主菜单中创建一个编辑字段?这听起来也不是一个选择。