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

C# 如何将服务添加到.Net中属性网格的类型描述符上下文中?,c#,.net,vb.net,propertygrid,C#,.net,Vb.net,Propertygrid,我有一个应用程序,允许用户在设计时选择一个图像,或者是直接图像,或者是从图像列表中选择 到目前为止一切都很酷,只是这不是从VisualStudio属性浏览器发生的,而是从作为类型编辑器一部分的属性网格发生的 我的问题是,图像选择器(实际上是资源选择器)和imagelist类型转换器都依赖于一些设计时服务来完成工作。对于imagelist,它是IReferenceService,对于资源选择器,它是一个名为_DTE的服务 在visual studio属性浏览器的第一个编辑实例中,我可以获得对这些服

我有一个应用程序,允许用户在设计时选择一个图像,或者是直接图像,或者是从图像列表中选择

到目前为止一切都很酷,只是这不是从VisualStudio属性浏览器发生的,而是从作为类型编辑器一部分的属性网格发生的

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

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

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

埃塔:我仍然不知道怎么做,但我现在知道这是可能的

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

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


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

多亏了reflector和framework CollectionEditor,我发现答案是通过PropertyGrid的Site属性得到的。这就是你要做的:

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

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

使用reflector,转到System.ComponentModel.Design.CollectionEditor.PropertyGridSite并将代码归档,而不是重新发明轮子