代码之家  ›  专栏  ›  技术社区  ›  Jules

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

  •  2
  • Jules  · 技术社区  · 14 年前

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

    到目前为止一切都很酷,除了这不是在visual studio属性浏览器中发生的,而是在类型编辑器的一部分属性网格中发生的。

    我的问题是,图像选择器(实际上是资源选择器)和ImageList类型转换器都依赖于一些设计时服务来完成任务。在ImageList的情况下,它是IReferenceService,在资源选取器的情况下,它是一个名为“DTE”的服务。

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

    如果我可以复制对类型描述符上下文中所有服务的引用,以备将来参考,那会更好。(2)房地产浏览器从哪里获得这些服务?

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

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

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

    是的,就这样。我会补充一个答案。

    1 回复  |  直到 14 年前
        1
  •  1
  •   Jules    14 年前

    感谢reflector和framework collectioneditor,我发现答案是通过propertygrid的site属性。你就是这样做的:

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

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

    使用reflector并转到system.componentmodel.design.collectioneditor.propertygridsite并获取代码,而不是重新设计轮子。