2011-08-03 37 views
0

我在使用我创建的自定义UserControl中的TextBox。似乎默认的上下文菜单不显示剪切,复制,粘贴的快捷方式。这很好,只要他们正在工作。使快捷方式出现在多个菜单中

但是,使用UserControl的我的FormMenuStrip也包含这些默认快捷方式。但是,现在快捷方式已分配到MenuStrip,因此剪切,复制,粘贴命令不再有效。

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

回答

0

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

好的,我可以将这些方法传递给方框。谢谢。但首先接受事件的是谁?这是一种泡沫吗?因此,重点项目首先获得控制权,并在稍后将其传递给表单?为什么在TextBox中不再使用默认的Ctrl + X?我相信我们正在处理泡沫破裂。 – Marnix

+0

不,您分配的快捷键使菜单/工具条项目首先获得Click事件。主动控制不会看到它。没有冒泡。通过我发布的代码,Ctrl + X现在将显式调用文本框'Cut()方法。让它像往常一样工作。 –

+0

我觉得很奇怪,需要明确的调用来保持命令的状态。 – Marnix

0

你必须启用相同的文本框的属性,它会开始响应。

只需验证myTextBox.ShortcutsEnabled = TRUE;

+0

ShortcutsEnabled已经设置为true。 *全选*正常工作,但剪切复制和粘贴不是。他们被我认为的主菜单接管。但对于* Select All *,menuItem中没有快捷方式:'CTRL + A' – Marnix