我正在探索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 Add-Ins向表单添加控件的教程,但没有一个提到这个问题。
我已经找到了我的问题的答案,但我仍然在与它的一些附带问题作斗争:
IEventBindingService myIEventBindingService = (IEventBindingService)myDesigner.GetService(typeof(IEventBindingService));
myIEventBindingService.ShowCode();
//obs: myDesigner is of type IDesignerHost
附带事项:
1)代码实际显示给用户。这是不希望的。
2)不能运行多次。
您希望多次运行它的原因是,为了能够实际向事件处理程序添加代码,此更新是必要的,因为除非更新设计器,否则无法找到它们。这意味着必须在添加每个事件处理程序之后添加每段代码。所以没有简单的方法来添加它们。
这样,我必须添加所有的事件处理程序,更新设计器,通过事件处理程序的名称获取对事件处理程序的引用,然后编写它们所做的任何事情。
我最终会解决这个问题(EnvDTE文档很差),然后我会更新这个答案。