【发布时间】:2011-03-04 13:29:54
【问题描述】:
我创建了一个 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 的 [save] 按钮,它只是没有变灰。即使我点击[全部保存],表格也不会被保存。然后我关闭 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() 方法一样。
那么额外的问题是:我在添加表单时是否跳过了一个步骤,或者我根本没有正确创建它?
【问题讨论】:
-
有那么复杂吗?这里没有人创建过向表单添加控件的加载项吗?
标签: c# visual-studio-2010 envdte