Я внедрил собственный класс конструктора, который наследуется от DocumentDesigner. Стандартный класс Form в .NET Framework использует класс FormDocumentDesigner (также наследующий от DocumentDesigner), но поскольку этот класс является внутренним, его невозможно наследовать и настроить его поведение. Я скопировал логику в этом классе с помощью отражателя и вставил это в моем пользовательском классе конструктора (так, чтобы поведение по умолчанию для дизайна моей формы соответствовало стандартной форме).
Все работает отлично, за исключением одного: в методе Initialize моего пользовательского класса дизайнера я хочу вставить элемент управления ToolStrip, чтобы каждый раз, когда моя форма открывалась во время разработки, этот элемент управления видим и редактируется. Проблема заключается в том, что метод Initialize вызывается каждый раз, когда вы закрываете и снова открываете форму в конструкторе, которая вызывает каждый раз, когда создается новый экземпляр элемента управления ToolStrip и добавляется в коллекцию элементов управления формы. Я ищу способ проверить, есть ли уже элемент управления ToolStrip, сериализованный в коде, и не добавляйте еще один.
До сих пор я узнал, что могу использовать событие LoadComplete IDesignerHost и проверить, есть ли ToolStrip в коллекции элементов управления формы. Тем не менее, любые лучшие идеи будут оценены.
Спасибо за ваше время!: -)
Ну, событие 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.