c# - Visual Studio MEF 扩展 - 强制更新或重绘边距字形

标签 c# visual-studio mef visual-studio-extensions

我正在编写的扩展程序开始于演练:创建 Microsoft 提供的边距字形示例:https://msdn.microsoft.com/en-us/library/ee361745.aspx

一切正常,除非我试图在我用来决定在哪条线上绘制字形的数据发生变化时触发重绘或更新边距字形。

基本上我在工具窗口中有一个按钮,当用户单击该按钮时,我希望在边距中出现一个字形。现在,它不会出现,直到您滚动并返回,或者显然关闭并重新加载文档。

我对此进行了研究,并且看到了一些使用 IViewTaggerProvider 而不是 ITaggerProvider 的代码示例。在这些情况下,似乎可以将 LayoutChanged 事件的处理程序添加到还包含 GetTags 方法的 ITagger 派生类中。但是我无法成功地将代码从使用 ITaggerProvider 切换到 IViewTaggerProvider,扩展在运行时崩溃了。我不知道这是一个会导致解决方案的更改,还是没有必要。

如何强制渲染字形?我可以引发某种事件来强制执行 GetTags 代码吗?我将如何从类外提出该事件?例如从工具窗口?

最佳答案

您走在正确的道路上,从 ITaggerProvider 更改为 IViewTaggerProvider 允许我重新绘制字形。我使用了 Walkthrough: Displaying Matching Braces 中的实现大括号匹配标记器提供程序部分进行这些更改的示例。

使用 IViewTaggerProvider,您可以调用

TagsChanged?.Invoke(this, new SnapshotSpanEventArgs(
                              new SnapshotSpan(
                                      SourceBuffer.CurrentSnapshot,
                                      0, 
                                      SourceBuffer.CurrentSnapshot.Length)));

在您的函数中显式调用 GetTags 并遍历当前快照中的跨度。

关于c# - Visual Studio MEF 扩展 - 强制更新或重绘边距字形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36760891/

相关文章:

javascript - 如何在 preventDefault() 之后启用默认链接按钮

c++ - 将 OpenGL 应用程序移植到 Windows 时遇到问题

visual-studio - 强制在 Visual Studio 2012 中重建项目依赖

c# - 如何使用 ActionFilterAttribute 记录运行时间?

c# - 检查删除一行是否安全

c# - 包含集合时激活 SoftDelete 数据过滤器

visual-studio - 创建 DLL,与 __declspec(dllexport) 混淆

dependency-injection - 为什么 MEF 有 [ImportMany] 而不仅仅是 [Import]

c# - MEF - 我是否需要实现 IPartImportsSatisfiedNotification

c# - Caliburn Micro -> 从多个 View /用户控件/自定义控件组合 View