Обновление дизайнера форм после добавления элементов управления через надстройку - PullRequest
0 голосов
/ 07 апреля 2011

Я изучаю библиотеку 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, но ни один из них не упомянул об этомпроблема ..

1 Ответ

1 голос
/ 20 апреля 2011

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

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

Коллатеральные вопросы:

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

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

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

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

...