【问题标题】:Make shortcuts appear in multiple menus使快捷方式出现在多个菜单中
【发布时间】:2011-08-03 12:35:32
【问题描述】:

我在我正在创建的自定义UserControl 中使用TextBox。似乎默认的上下文菜单没有显示剪切、复制、粘贴的快捷方式。没关系,只要它们正常工作。

但是我的Form 使用UserControl 有一个MenuStrip,其中也包含这些默认快捷方式。但是剪切、复制、粘贴命令不再起作用,因为快捷方式已分配给MenuStrip

如何在表单的多个位置使用快捷方式?传递像 Cut 这样的全局命令并将其更深入地发布到我的UserControl 的最佳方法是什么?是否可以将快捷方式添加到文本框的默认上下文菜单中?

【问题讨论】:

    标签: c# winforms .net-4.0


    【解决方案1】:

    MenuStrip 项或 ToolStrip 项在单击或按下其快捷键时不会更改焦点。这是实现此功能的门票,表单的 ActiveControl 告诉您哪个控件具有焦点。你只需要检查它是否是一个文本框。像这样:

        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();
        }
    

    【讨论】:

    • 好的,我可以将这些方法传递给盒子。谢谢。但谁是第一个收到事件的人?这是一种冒泡的方式吗?那么重点项目首先获得控制权并稍后将其传递给表单?为什么默认的 Ctrl+X 在 TextBox 中不再起作用?我相信我们正在应对泡沫破灭。
    • 不,您分配的快捷键使菜单/工具条项首先获得 Click 事件。活动控件不会看到它。没有冒泡。使用我发布的代码,Ctrl+X 现在将显式调用文本框的 Cut() 方法。让它像往常一样工作。
    • 我觉得奇怪的是需要显式调用才能保持命令不变。
    • 好吧,不要重新分配 Ctrl+X 快捷键,您也不必这样做。
    • 如何在主菜单中创建Edit 字段而不将 CTRL+X 的快捷方式重新分配给菜单条?这听起来也不是一种选择。
    【解决方案2】:

    你只需要启用文本框的属性,它就会开始响应。

    只需验证myTextBox.ShortcutsEnabled = TRUE;

    【讨论】:

    • ShortcutsEnabled 已设置为 true。 全选 工作正常,但剪切复制和粘贴不正常。我认为它们被主菜单接管。而且对于全选,menuItem 中没有快捷方式说:CTRL+A
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多