Пользовательский элемент управления .NET (ToolStripControlHost) наносит ущерб дизайнеру - PullRequest
14 голосов
/ 13 января 2012

Мне нужно иметь MaskedTextBox в ToolStrip, который не включен по умолчанию, поэтому я следовал советам, которые нашел в Интернете, и создал собственный элемент управления, который наследуется от 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 даже самым маленьким способом. Как добавление одного пробела. С этого момента дизайнер будет работать нормально. Пока я не построю решение. Затем дизайнер снова зависает. Ни один из элементов управления в форме не может быть отредактирован.

Ответы [ 5 ]

11 голосов
/ 17 января 2012

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

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

Я нашел некоторую информацию на форуме MSDN.

Это происходит потому, что класс ToolStripControlHost не имеет конструктора без параметров.

Чтобы решить эту проблему, вы можете создать свой собственный ToolStripControlHost с конструктором без параметров и сделать ToolStripMaskedTextBox унаследованным от вашего ToolStripControlHost. Попробуйте что-то вроде следующего

* * 1010

Это исправит проблему с вашим исключением.

Проблема с конструктором форм (ToolStripMaskedTextBox не отображается после запуска приложения) не решена, но вы можете закрыть конструктор и снова открыть файл.

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

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

1 голос
/ 02 декабря 2013

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

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

0 голосов
/ 30 января 2019

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

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

0 голосов
/ 06 июня 2015

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

0 голосов
/ 24 января 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...