WinForms ToolStrip недоступен в визуальном наследовании

Допустим, у меня есть FormChild, наследующий FormParent. У родителя есть всплывающая подсказка вверху. В моей дочерней форме я хочу добавить дополнительные элементы, но элемент управления всегда заблокирован, хотя я установил модификаторы на защищенные.

Я проверил Интернет, кажется, это хорошо известная ошибка; но кто-нибудь знает обходной путь или что-то?

3 ответа

Ну, вы можете вручную редактировать файл FormChild.Designer.cs. Там вы можете получить доступ к унаследованной панели инструментов.

Редактировать:

  1. Добавьте этот класс:

    //System.Design.dll required
    [Designer(typeof(System.Windows.Forms.Design.ControlDesigner))]
    public class InheritableToolStrip : ToolStrip { }
    
  2. Скомпилировать проект

  3. Используйте InheritableToolStrip из панели инструментов для добавления в FormParent.
  4. Измените свойство модификатора на защищенное.
  5. Добавить элементы в унаследованную панель инструментов в FormChild.

и вы должны быть в состоянии проектировать контроль в дизайнере. Попробовал немного - похоже, работает.

Ps Iam используя VS2010, .NET v4

Microsoft заблокировала Visual Inheritance для сложных элементов управления, потому что они не могли понять, как управлять сериализацией дизайнеров дочерних элементов управления над деревом наследования простым способом.

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

Я разработал элементы управления MergableToolStrip, которые вы можете бесплатно использовать здесь

Вы можете передать toolstrip дочерней форме следующим образом.

public partial class ChildForm : Form
{ 
    private readonly ToolStrip parentToolStrip;

    public ChildForm(ToolStrip strip)
    {
        parentToolStrip = strip;
    }
}

Обратите внимание, что приведенный выше синтаксис кода может быть неправильным, я знаю, что имя элемента управления длиннее, чем просто ToolStrip, я просто использовал его в качестве демонстрации, чтобы показать вам концепцию.

Другие вопросы по тегам