如何将服务添加到.Net中属性网格的类型描述符上下文中?

时间:2010-04-13 19:52:28

标签: c# .net vb.net propertygrid

我有一个应用程序,允许用户在设计时选择一个图像,可以是直图像,也可以是图像列表。

到目前为止一切都很酷,除了视觉工作室属性浏览器没有发生这种情况,它是从属性网格中发生的,属性网格是类型编辑器的一部分。

我的问题是,图像选择器(实际上是资源选择器)和图像列表类型转换器都依赖于一些设计时服务来完成工作。在imagelist的情况下,它是IReferenceService,在资源选择器的情况下是一个名为_DTE的服务。

在visual studio属性浏览器的第一个编辑实例中,我可以获得对这些服务的引用,但(1)如何将它们添加到属性网格的类型描述符上下文中?

如果我可以只复制对类型描述符上下文中的所有服务的引用,那么对于将来的验证会更好。 (2)物业浏览器首先从哪里获得这些服务?

ETA:我仍然不知道该怎么做,但我现在知道这是可能的。

(1)子类控制并添加一个类型为按钮数组的属性 (2)将其添加到表格中 (3)在设计服务上选择新控件,然后在属性浏览器中编辑新属性 (4)弹出集合编辑器对话框 (5)添加按钮
(6)编辑图像和图像列表 - 类型编辑器和类型转换器分别表现得如此。

ETA2:好的,我变暖了。看起来你是通过属性网格的Site属性来完成的。我可以创建一个新站点,并将其传递给我引用的类型描述符上下文,然后它应该具有所有服务。我会试一试......

ETA3:是的,就是这样。我会添加一个答案。

1 个答案:

答案 0 :(得分:1)

感谢反射器和框架CollectionEditor,我发现答案是通过PropertyGrid的Site属性。这就是你要做的:

(1)保存对ITypeDescriptor上下文的引用。您可以从属性浏览器或设计图面的第一次编辑中执行此操作。

(2)创建自己的属性网格后,将Site属性设置为包含原始上下文中所有服务的新站点。

不要重新发明轮子,而是使用反射器,然后转到System.ComponentModel.Design.CollectionEditor.PropertyGridSite并使用代码。