将自定义动词添加到 ToolStrip 设计器,而无需重新实现 ToolStripDesigner

Add Custom Verb to ToolStrip designer without having to reimplement the ToolStripDesigner

我正在开发一个自定义 ToolStrip 来替换我想兼作菜单栏的窗体的标题栏。我想要做的是向 ToolStrips 动词菜单添加一个动词,它将添加标准菜单项,例如文件、编辑。

我可以通过自定义 ControlDesign 来做到这一点,但是添加的项目不会保留在窗体的 InitializeComponent 方法中。此外,我不认为我想使用自定义 ControlDesigner,因为我失去了很多我必须重新实现的功能,而且 ToolStripDesigner 是内部的,所以我不能继承它。

有什么方法可以向 ToolStrips 动词菜单添加类似于插入标准项的选项,而无需重新实现 ToolStripDesigner。

感谢您的帮助 丹尼

PS抱歉,如果这有点乱,我已经 2 天没睡觉了。

ToolStripDesigner 是内部的并且依赖于其他内部 类 并且你不能继承它。此外,您不应为 ToolStrip 创建新的控件设计器,因为您将失去当前的设计器功能,例如使用设计器添加项目。

一个非常好的技巧 是在设计时找到设计器并操纵设计器。

如何在不丢失设计器功能的情况下向 ToolStrip 设计器添加自定义动词?

您可以在设计时找到控件的设计器并对其进行操作。 OnHandleCreated 方法是一个好点。您可以从控件的 Site 中获取 IDesignerHost 的实例,然后获取设计器。然后就可以获取控件的action list集合,并添加自定义动词。

/*Add a reference to System.Design.dll*/

using System;
using System.ComponentModel.Design;
using System.Windows.Forms;
using System.Windows.Forms.Design;
public class MyCustomToolStrip : ToolStrip
{
    private IDesignerHost designerHost;
    protected override void OnHandleCreated(EventArgs e)
    {
        base.OnHandleCreated(e);
        if (this.DesignMode && Site != null)
        {
            designerHost = Site.GetService(typeof(IDesignerHost)) as IDesignerHost;
            if (designerHost != null)
            {
                var designer = designerHost.GetDesigner(this);
                if (designer != null)
                {
                    var actionList = ((ControlDesigner)designer).ActionLists[0];
                    designer.Verbs.Add(new DesignerVerb("My Custom Verb", MyCustomVerb));
                }
            }
        }
    }
    private void MyCustomVerb(object sender, EventArgs e)
    {
        MessageBox.Show("My Custom Verb added!");
    }
}