我正在开发一个自定义ToolStrip来替换我想要兼作菜单栏的Form的TitleBar。我要做的是在ToolStrips动词菜单中添加一个动词,它将添加标准菜单项,如文件,编辑。
我可以通过Custom ControlDesign执行此操作,但Items添加不会保留在Form的InitializeComponent方法中。此外,我不认为我想使用自定义ControlDesigner,因为我失去了很多功能,我将不得不重新实现,而ToolStripDesigner是内部的,所以我无法继承。
我是否可以在ToolStrips Verbs菜单中添加一个类似于Insert Standard Items的选项,而无需重新实现ToolStripDesigner。
感谢您的帮助 丹尼
PS对不起,如果这有点漫无目的,我还没有在2天内睡觉。
答案 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!");
}
}