c# – .NET自定义控件(ToolStripControlHost)对设计器造成严重破坏

我需要在ToolStrip中有一个MaskedTextBox,默认情况下不包含MaskedTextBox,所以我遵循了一些在线发现的建议,并创建了继承自ToolStripControlHost的自定义控件.当我运行应用程序时,我创建的工作非常好,但这真的搞砸了设计师.通过“混乱”,我的意思是自定义控件(和其他一些)从ToolStrip消失.此外,我不能再向ToolStrip添加新的控件,并且我无法选择ToolStrip上的现有控件进行编辑.

这是我的课.

[DesignerCategory("code")]
[ToolStripItemDesignerAvailability(ToolStripItemDesignerAvailability.ToolStrip | ToolStripItemDesignerAvailability.StatusStrip)]
public partial class ToolStripMaskedTextBox : ToolStripControlHost
{
    public MaskedTextBox MaskedTextBox
    {
        get { return Control as MaskedTextBox; }
    }

    public ToolStripMaskedTextBox()
        : base(CreateControlInstance()) { }

    private static Control CreateControlInstance()
    {
        MaskedTextBox mtb = new MaskedTextBox();
        mtb.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
        mtb.MinimumSize = new System.Drawing.Size(100, 16);
        mtb.PasswordChar = '*';
        return mtb;
    }
}

任何帮助我可能做错了,给设计师一个困难的时刻将不胜感激.

添加信息

现在当我在Visual Studio中打开我的类文件时,我收到一个带有以下错误的警告页:

Constructor on type 'System.Windows.Forms.ToolStripControlHost' not found. 

添加信息2

问题只在构建解决方案后才会出现.我可以通过修改Form.Designer.cs文件甚至最小的方式使设计人员正常工作.喜欢添加一个空格.从那里开始,设计师将工作正常.直到我构建解决方案.然后设计师再次冻结.表单上的任何控件都不能被编辑.

根据例外情况

Constructor on type 'System.Windows.Forms.ToolStripControlHost' not found. 

我在MSDN论坛上找到了一些信息.

这发生了,因为ToolStripControlHost类没有没有参数的构造函数.

要解决这个问题,您可以使用无参数构造函数创建自己的ToolStripControlHost,并使ToolStripMaskedTextBox从ToolStripControlHost继承.尝试以下的东西

//Declare a class that inherits from ToolStripControlHost.
[ToolStripItemDesignerAvailability(ToolStripItemDesignerAvailability.ToolStrip | ToolStripItemDesignerAvailability.StatusStrip)]
public class ToolStripMaskedTextBox : MyCustomToolStripControlHost
{
    // Call the base constructor passing in a MaskedTextBox instance.
    public ToolStripMaskedTextBox() : base(CreateControlInstance()) { }

    public MaskedTextBox MaskedTextBox
    {
        get
        {
            return Control as MaskedTextBox;
        }
    }


    private static Control CreateControlInstance()
    {
        MaskedTextBox mtb = new MaskedTextBox();
        mtb.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
        mtb.MinimumSize = new System.Drawing.Size(100, 16);
        mtb.PasswordChar = '*';
        return mtb;
    }
}

public class MyCustomToolStripControlHost : ToolStripControlHost
{
    public MyCustomToolStripControlHost()
        : base(new Control())
    {
    }
    public MyCustomToolStripControlHost(Control c)
        : base(c)
    {
    }
}

这将解决您的异常问题.

表单设计器(运行应用程序后ToolStripMaskedTextBox不可见)的问题未解决,但您可以关闭设计器并再次打开该文件.

那么你可以没有任何问题.

希望这可以帮助

翻译自:https://stackoverflow.com/questions/8856394/net-custom-control-toolstripcontrolhost-wreaks-havoc-on-the-designer

转载注明原文:c# – .NET自定义控件(ToolStripControlHost)对设计器造成严重破坏