我有一个应用程序,允许用户在设计时选择图像,无论是直接图像还是从图像列表中。
到目前为止,一切都很酷,除了这不是发生在 Visual Studio 属性浏览器中,而是发生在作为类型编辑器一部分的属性网格中。
我的问题是,图像选择器(实际上是资源选择器)和图像列表类型转换器都依赖于一些设计时服务来完成工作。对于图像列表,它是 IReferenceService;对于资源选择器,它是一个名为 _DTE 的服务。
在从 Visual Studio 属性浏览器进行编辑的第一个实例中,我可以获得对这些服务的引用,但是 (1) 如何将它们添加到属性网格的类型描述符上下文中?
如果我可以复制对类型描述符上下文中所有服务的引用,那么为了将来的验证,效果会更好。 (2) 属性浏览器首先从哪里获取这些服务?
ETA:我仍然不知道该怎么做,但我现在知道这是可能的。
(1)子类化控件并添加一个类型为按钮数组的属性。
(2) 将其添加到表单中。
(3) 在设计服务上选择新控件并在属性浏览器中编辑新属性。
(4) 弹出集合编辑器对话框
(5) 添加按钮
(6) 编辑图像和图像列表 - 类型编辑器和类型转换器分别按其应有的方式运行。
ETA2:好的,我暖和了。看起来您是通过属性网格的 Site 属性来完成此操作的。我可以创建一个新站点,并向其传递我引用的类型描述符上下文,然后它应该拥有所有服务。我会尝试一下...
ETA3:是的,就是这样。我会添加一个答案。
感谢 Reflector 和 CollectionEditor 框架,我发现答案是通过 PropertyGrid 的 Site 属性。这是你做的:
(1) 保存对 ITypeDescriptor 上下文的引用。您可以从属性浏览器或设计界面的第一次编辑中执行此操作。
(2) 创建您自己的属性网格后,将“站点”属性设置为包含原始上下文中的所有服务的新站点。
不要重新发明轮子,而是使用反射器,然后转到 System.ComponentModel.Design.CollectionEditor.PropertyGridSite 并编写代码。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)