Класс Custom Designer для проблемы .NET Windows Form - PullRequest
2 голосов
/ 26 мая 2009

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

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

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

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

1 Ответ

1 голос
/ 26 мая 2009

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

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 .

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