我编写了一个Visual Studio 2013扩展,用于观察Windows.Forms设计器窗口。当开发人员在设计器窗口中更改控件时,扩展程序将尝试验证结果是否与我们的ui样式指南一致。如果发现可能的违规,则会在工具窗口中列出它们。这一切都很好。但是现在我想在设计器窗口中标记不一致的控件,例如用红色框或类似的标记。
不幸的是,我没有找到在设计器窗口中的控件上绘制装饰的方法。我知道如果您自己开发,就可以绘制这些装饰ControlDesigner
,但是我需要在控件设计者的“外部”进行绘制。我只有IDesignerHost
从那里,Dte2.ActiveWindow
并且可以通过该主机访问Controls和ControlDesigners。我找不到从ControlDesigners外部添加装饰的任何方法。我现在的解决方法是捕获控件的Paint-Events并尝试从此处绘制装饰。对于所有控件(例如ComboBoxes等),这并不是很好,因为并非所有控件都可以在它们上绘制。因此,我不得不使用其父控件的Paint事件。并且该解决方案还有其他缺点。
我希望有人能告诉我是否有更好的方法。我非常确定必须有一个:如果使用Menu-> View-> Tab Order(不确定正确的英语菜单标题,我使用的是德语IDE),则可以看到IDE本身就是能够修饰控件(没有屏幕截图,因为这是我的第一篇关于SO的文章),而且我确定它没有像我这样使用变通方法。它是如何做到的?
我已经搜索了好几个星期了。感谢您的任何帮助,建议和研究起点。
更新:
这张屏幕截图也许会更加清晰:
从视图菜单中选择“制表符顺序”时,Visual Studio会显示那些用蓝色数字标记的插入符号。我的问题是IDE如何做到这一点。
如前所述,我尝试Paint
在控件事件中执行此操作,但是例如ComboBox实际上并不支持该事件。而且,如果我使用父级Paint
事件,则只能在子级控件周围绘制,因为它们是在父级控件之后绘制的。
我还考虑过在控件或ControlDesigner
s上使用反射,但是不确定如何挂钩受保护的OnPaintAdornments
方法。而且我不认为IDE开发人员会使用这些“肮脏”的把戏。
我相信您正在寻找BehaviorService体系结构。行为服务概述在这里解释了带有行为,Adorner和Glyph等支持部分的体系结构。例如
扩展设计时用户界面
该BehaviorService模型实现了对现有设计用户界面上可以很容易地分层的新功能。新的UI保持独立于其他先前定义的Glyph和Behavior对象。例如,某些控件上的智能标记是由访问雕文在控制(智能标记雕文)的上右上角。
智能标记代码创建自己的Adorner层,并将Glyph对象添加到该层。这样可以使智能标记字形对象与选择字形对象分离。将新的Adorner添加到Adorners集合的必要代码很简单。
等等
希望能有所帮助。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句