Обновление конструктора форм после добавления элементов управления через надстройку

Я изучаю библиотеку EnvDTE и создаю генератор форм.

Я успешно добавил элементы управления в форму, однако коды элементов управления не добавляются в конструктор форм (formname.Designer.cs), и это проблема, если я хочу добавить обработчики событий, поскольку элементы управления еще не объявлены .

Когда я дважды щелкаю кнопку, которая добавляет обработчик событий к кнопке в дизайнере форм, добавляются все элементы управления в дизайнере форм. Так что любое обновление должно это делать.

Вот как я добавляю элементы управления:

//this ProjectItem (itemFrom) is a reference to a recently added form,
//and its only window is my form

Window myWindow = itemForm.Document.Windows.Item(1);

IDesignerHost myDesigner = (IDesignerHost)myWindow.Object;

IComponent comp = myDesigner.CreateComponent(typeof(Button), "MyNewButton);

Вопрос: Как мне программно обновить конструктор форм (с помощью EnvDte или VS API), чтобы получить ссылки на мои элементы управления и добавить к ним обработчики событий?

Одна странная вещь: я нашел пару руководств по добавлению элементов управления в формы через надстройки VS, но ни в одном из них эта проблема не упоминалась.


person Marcelo    schedule 07.04.2011    source источник


Ответы (1)


Я нашел ответ на свои вопросы, но я все еще борюсь с некоторыми сопутствующими проблемами:

IEventBindingService myIEventBindingService = (IEventBindingService)myDesigner.GetService(typeof(IEventBindingService));
myIEventBindingService.ShowCode();
//obs: myDesigner is of type IDesignerHost

Залоговые вопросы:

1) Код фактически показывается пользователю. Что нежелательно.
2) Вы не можете запускать его более одного раза.

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

Таким образом, мне пришлось добавить все обработчики событий, обновить дизайнер, получить ссылки на обработчики событий через их имена и только потом писать все, что они делают.

В конце концов я исправлю это (EnvDTE плохо документирован), а затем обновлю этот ответ.

person Marcelo    schedule 20.04.2011