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快捷键重新指定给菜单条,你如何在主菜单中创建一个
编辑
字段?这听起来也不是一个选择。