Класс Custom Designer для проблемы .NET Windows Form

2

Я внедрил собственный класс конструктора, который наследуется от DocumentDesigner. Стандартный класс Form в .NET Framework использует класс FormDocumentDesigner (также наследующий от DocumentDesigner), но поскольку этот класс является внутренним, его невозможно наследовать и настроить его поведение. Я скопировал логику в этом классе с помощью отражателя и вставил это в моем пользовательском классе конструктора (так, чтобы поведение по умолчанию для дизайна моей формы соответствовало стандартной форме).

Все работает отлично, за исключением одного: в методе Initialize моего пользовательского класса дизайнера я хочу вставить элемент управления ToolStrip, чтобы каждый раз, когда моя форма открывалась во время разработки, этот элемент управления видим и редактируется. Проблема заключается в том, что метод Initialize вызывается каждый раз, когда вы закрываете и снова открываете форму в конструкторе, которая вызывает каждый раз, когда создается новый экземпляр элемента управления ToolStrip и добавляется в коллекцию элементов управления формы. Я ищу способ проверить, есть ли уже элемент управления ToolStrip, сериализованный в коде, и не добавляйте еще один.

До сих пор я узнал, что могу использовать событие LoadComplete IDesignerHost и проверить, есть ли ToolStrip в коллекции элементов управления формы. Тем не менее, любые лучшие идеи будут оценены.

Спасибо за ваше время!: -)

Теги:
winforms
custom-controls
design-time

1 ответ

1
Лучший ответ

Ну, событие LoadComplete является правильной точкой. Обычно я проверяю свойство "Загрузка", чтобы проверить, происходит ли инициализация во время загрузки или вызывается после загрузки.

IDesignerHost _host;
Form _form;

public override void Initialize(System.ComponentModel.IComponent component)
{
  _form = component as Form;
  _host = (IDesignerHost)this.GetService(typeof(IDesignerHost));
  if (_host != null)
  {      
   if (_host.Loading)
   {
     _host.LoadComplete += new EventHandler(_host_LoadComplete);
   }
   else
   {
     initializeForm();
   }
  }
}

void _host_LoadComplete(object sender, EventArgs e)
{
  _host.LoadComplete -= new EventHandler(_host_LoadComplete);
  initializeForm();
}

void initializeForm()
{
   if (_form!= null)
   {
      ...
   }
}

Другим подходом является создание компонента, который можно переместить в форму и создать конструктор для компонента вместо воссоздания FormDesigner. От конструктора компонентов вы можете получить родительскую форму с помощью свойства _host.RootComponent.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню