.NET自定义控件(ToolStripControlHost)破坏设计器上的Havoc

本文关键字:Havoc 自定义控件 ToolStripControlHost NET | 更新日期: 2023-09-27 18:20:11

我需要在ToolStrip中有一个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文件使设计器正常工作,哪怕是最小的方式。就像添加一个空格。从那时起,设计师会做得很好。直到我构建解决方案。然后设计师又僵住了。表单上的任何控件都无法编辑。

.NET自定义控件(ToolStripControlHost)破坏设计器上的Havoc

根据异常

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

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

之所以会发生这种情况,是因为ToolStripControlHost类没有不带参数的构造函数。

要解决这个问题,您可以使用none参数构造函数创建自己的ToolStripControlHost,并使ToolStripMaskedTextBox继承自ToolStripCntrolHost。试试下面的

//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不可见)尚未解决,但您可以关闭设计器并再次打开文件。

然后你就可以毫无问题地继续了。

希望这有帮助

我使用了dknaack的解决方案,但将MyCustomToolStripControlHost类放置在System.Windows.Forms命名空间中的一个单独文件中。和

首先:它是有效的——也不例外。然后:我的控制也在设计器中可见,所以这是一个头奖。

在这个链接中,答案是实现"blah"接口的对象必须具有无参数构造函数。试试看。

FWIW:我也成功地使用了上述dknaack的解决方案,但这是在我意识到我在错误的地方寻找自定义ToolStrip控件之后。自定义控件不会显示在工具箱本身中。相反,它显示在组件的下拉列表中的"添加ToolStripButton"下,当它被选中时(在设计器中),该按钮会出现在ToolStrip上。

我找到了设计师问题的解决方案。https://dobon.net/vb/dotnet/control/tschdesigneravail.html#tips_comment(日语)

你所需要的只是从ToolStrip派生一个类并替换它

class DesignerFriendlyToolStrip : ToolStrip { }
var ts = new DesignerFriendlyToolStrip();
ts.Items.Add(toolStripMaskedTextBox);
form.Controls.Add(ts);

我不知道为什么这是有效的。谁知道。。。?