通过扩展在Visual Studio Designer中的Windows.forms.controls上绘制装饰

雷内·沃格特

我编写了一个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事件,则只能在子级控件周围绘制,因为它们是在父级控件之后绘制的。

我还考虑过在控件或ControlDesigners上使用反射,但是不确定如何挂钩受保护的OnPaintAdornments方法。而且我不认为IDE开发人员会使用这些“肮脏”的把戏。

伊万·斯托夫

我相信您正在寻找BehaviorService体系结构。行为服务概述在这里解释了带有行为AdornerGlyph等支持部分的体系结构例如

扩展设计时用户界面

BehaviorService模型实现了对现有设计用户界面上可以很容易地分层的新功能。新的UI保持独立于其他先前定义的GlyphBehavior对象。例如,某些控件上的智能标记是由访问雕文在控制(智能标记雕文)的上右上角。

智能标记代码创建自己的Adorner层,并将Glyph对象添加到该层。这样可以使智能标记字形对象与选择字形对象分离将新的Adorner添加Adorners集合的必要代码很简单。

等等

希望能有所帮助。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Visual Studio 2019 C#Windows Forms App(.NET Framework)-没有View Designer或View Code

通过扩展API在Visual Studio Code中更改光标外观

在Visual Studio上运行Xamarin Forms iOS的GetBuiltProjectOutputRecursive错误

在 Visual Studio 2017 中找不到 ClassLibrary(Xamarin.Forms)

Xamarin Forms在Visual Studio中的编译错误

在Visual Studio 2017中没有xamarin.forms BlankApp

Visual Studio 2017 Pro 中的 Xamarin.Forms Azure

Windows Forms Application菜单Visual Studio 2017中的条带比2019更方便?

在代码编辑器中修改了Forms.UserControl的designer.vb,现在在Visual Studio 2017中不可见设计视图

如何通过Visual Studio扩展使构建失败

通过Visual Studio Code提交的扩展消息?

使用Xamarin.Forms.Maps Visual Studio上C#代码中的变量从.xaml文件更改静态地图坐标

在Visual Studio代码上安装扩展

Visual Studio 2015中的应用扩展问题

Visual Studio 2017 中未显示的扩展

Visual Studio扩展中的静态数据

在扩展中获取Visual Studio构建进度

在Visual Studio扩展中更改“颜色主题”

无法禁用Visual Studio中的扩展

Visual Studio中的错误...扩展加载问题

Windows窗体中控件的位置和大小在Visual Studio Designer和编程实例化之间有所不同

不会触发Visual Studio装饰附件扩展事件

Visual Studio扩展:从装饰品获取包

在MS Visual Studio Community 2015中向C#Windows Forms应用程序添加依赖项

如何防止在Windows Forms应用程序版本中创建.exe.config(Visual Studio Community 2019-C#)

扩展中的Visual Studio 2012选项卡栏上是否获取文档已固定

如何在Mac上的Visual Studio中安装.vsix扩展文件?

断点无法通过Windows 10和WSL2上的Visual Studio Code调试Chrome中的React应用

Visual Studio Xamarin Forms 应用程序无法在 iPhoneSimulator 上启动