Подтвердить что ты не робот

.NET Custom Control (ToolStripControlHost) наносит ущерб дизайнеру

Мне нужно иметь MaskedTextBox в ToolStrip, который по умолчанию не включен, поэтому я следил за некоторыми советами, которые я нашел в Интернете, и создал собственный элемент управления, который наследуется от ToolStripControlHost. То, что я создал, отлично работает, когда я запускаю приложение, но это действительно запутывает конструктора. "Messes up", я имею в виду, что пользовательский элемент управления (наряду с некоторыми другими) исчезает из 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 даже самым маленьким способом. Как добавление одного пробела. Оттуда дизайнер будет работать нормально. Это до тех пор, пока я не построю решение. Затем дизайнер снова замерзает. Ни один из элементов управления в форме не может быть отредактирован.

4b9b3361

Ответ 1

Согласно исключению

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 не отображается после запуска приложения) не решена, но вы можете закрыть конструктор и снова открыть файл.

Тогда вы можете продолжать без проблем.

Надеюсь, что это поможет

Ответ 2

Я использовал решение dknaack, но поместил класс MyCustomToolStripControlHost в отдельный файл в пространстве имен System.Windows.Forms. И...

Во-первых: он работает - не исключение. Затем: мой элемент управления также виден в дизайнере, поэтому это джек-пот.

Ответ 3

В этой ссылке ответ заключался в том, что объекты, реализующие интерфейс "blah", должны иметь конструктор без параметров. Попробуйте.

Ответ 4

FWIW: Я также преуспел с решением dknaack выше, но только после того, как понял, что искал пользовательский ToolStrip Control в неправильном месте. Пользовательский элемент управления не отображается в самой панели инструментов. Скорее он отображается в выпадающем списке компонентов под "Add ToolStripButton", который появляется в ToolStrip, когда он выбран (в дизайнере).

Ответ 5

Я нашел решение дизайнерской проблемы. 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);

Я не знаю, почему это эффективно. Кто-нибудь знает...?