Я создал надстройку Visual Studio, которая добавляет форму к существующему проекту в открытом решении.
Вот как я создаю форму:
string templatePath = sol.GetProjectItemTemplate("Form.zip", "csproj");
//sol is an EnvDTE80.Solution2
proj.ProjectItems.AddFromTemplate(templatePath, formName);
//proj is an EnvDTE.Project
После этогоЯ могу успешно получить ссылку на ProjectItem добавленной формы, затем я могу получить ссылку на System.Windows.Forms.Form, и с помощью этой ссылки я могу добавить кнопку в форму следующим образом:
Button btn = new Button();
btn.Text = "my funky button";
btn.Name = "newButton";
btn.Size = new Size(150, 23);
btn.Location = new Point(30, 30);
frmNewForm.Controls.Add(btn);
//frmNewForm is a System.Windows.Forms.Form
И затем кнопка успешно добавляется в форму:
Однако, когда я пытаюсь сохранить эту форму, она просто не сохранится.Я нажимаю кнопку [сохранить] в Visual Studio, она просто не становится серой.Даже если я нажму [Сохранить все], форма не будет сохранена.Затем я закрываю Visual Studio, снова открываю его и открываю проект, в который я добавил новую форму с помощью своего надстройки, а новой кнопки просто нет.Просто пустая форма.
Я даже пытался сохранить проект и решение программно с помощью следующего кода:
itemForm.Save(itemForm.Name);
//itemFrom is an EnvDTE.ProjectItem
proj.Save(proj.FullName);
//proj is an EnvDTE.Project
Я думал, что это произойдет, потому что экземплярVisual Studio, которую я использовал для тестирования моей надстройки, является отладочной и открывается сразу после запуска моей надстройки.Но я попытался использовать установленную надстройку (которая осталась автоматически после запуска), и проблема не исчезла.
Обновление
Я только что заметил двевещи:
1) кнопка появляется только на дизайне формы, и больше нигде.И он даже не позволяет мне выбрать его, чтобы увидеть его атрибуты.
Его имя не отображается в Intellisense, в списке объектов или даже в проектном документе формы.
В качестве теста я добавил кнопку вручную, и эту я могу выбрать и взаимодействовать с ней:
Что я могу получить, так это то, что янеправильно добавляешь кнопку.
Тогда новый вопрос о кнопке будет таким: Как я могу добавить новую кнопку в форму, созданную через EnvDTE, чтобы я мог взаимодействовать с ней во время разработки?
2) Пытаясь увидеть отличия от моей забавной кнопки и моей кнопки, добавленной вручную, я попытался сделать что-то, чего раньше не было, с помощью программно созданной формы: создать экземпляр и запустить его.
И вот как я это сделал:
MyFunkyForm frm = new MyFunkyForm ();
frm.Show();
Он мигает на экране (видимо, ни с одной из моих двух кнопок), и выполнение заканчивается.Даже если я попытаюсь что-то сделать с его Form_load, он будет выполнен, тогда форма мигает, и выполнение заканчивается (форма закрыта и отладка завершена), как если бы я вызвал метод Close ().
Тогда дополнительный вопрос будет следующим: пропустил ли я шаг при добавлении формы или я вообще не создаю его должным образом?