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

时间:2016-06-04 17:48:50

标签: c# winforms windows-forms-designer design-time

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

我可以通过Custom ControlDesign执行此操作,但Items添加不会保留在Form的InitializeComponent方法中。此外,我不认为我想使用自定义ControlDesigner,因为我失去了很多功能,我将不得不重新实现,而ToolStripDesigner是内部的,所以我无法继承。

我是否可以在ToolStrips Verbs菜单中添加一个类似于Insert Standard Items的选项,而无需重新实现ToolStripDesigner。

感谢您的帮助 丹尼

PS对不起,如果这有点漫无目的,我还没有在2天内睡觉。

1 个答案:

答案 0 :(得分:1)

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

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

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

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

/*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!");
    }
}