如何实现Visual Studio MEF扩展,提供"导航"组合框

时间:2013-01-17 18:31:14

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

我使用MEF开发了一个小型Visual Studio扩展。该扩展程序将文本格式,智能感知和工具提示添加到带有DSL的文本文件中。

有没有办法,使用MEF,在右上角添加一个组合框,可以容纳DSL的“第一级”结构,以便轻松导航到文件中定义的位置?我正在考虑一些与默认的Visual Studio C#编辑器相似的东西来选择类(左上角)或类(右上角)中的方法/属性/等。

由于扩展已经具有格式化和智能感知,因此识别和标记我想要包含在组合中的构造及其行号所需的代码已经完成。我只需要一些关于如何将组合添加到编辑器的上边缘并使其在选择更改时将光标移动到特定行的指针。

2 个答案:

答案 0 :(得分:1)

您对类型和成员下拉栏感兴趣,(我最后检查过)不会暴露给MEF扩展。您需要执行以下操作之一:

  1. IVsDropdownBar创建自己的适配器,您可以在MEF扩展中使用该适配器。
  2. 避免使用标准功能,并实现IWpfTextViewMarginProvider,在原始位置,样式和功能相同的位置创建边距。
  3. 如果您使用第二种方法,请记住它与标准功能不同。如果在Visual Studio for C#或其他标准语言中使用Window→Split命令,它将创建一个顶部和底部窗格,它将共享一组类型&会员吧。自定义IWpfTextViewMargin将在同一场景中重复。

    我在Visual Studio 2010的ANTLR Language Support扩展中使用的下拉列表使用了第二种方法,它结果远非微不足道,但至少我能够重用我为我发布的其他语言扩展创建的组件

答案 1 :(得分:0)

为了补充@ 280Z28所说的内容,我建议不要实施IVsDropdownBar并建议使用IWpfTextViewMarginProvider。保证金提供商路线是编辑器直接提供的MEF扩展,允许您通过编辑器的TextViewRoleContentType属性来控制保证金的加载,这些属性可以放在您的出口保证金提供商处。

为了将插入符号移动到给定的功能位置,您可以使用各种方法,例如IWpfTextView.Caret提供的方法。移动后请确保在插入符号上调用EnsureVisible以确保文本视图将滚动到您将插入符号移动到的位置。

关于@ 280Z28提到的分割窗口案例,您可以随时使用IPropertyOwner的方法,并将属性添加到ITextBuffer.Properties提供的属性包中,以检查您已提供的案例缓冲区的余量。通过向属性包添加标记,您可以检查拆分大小写并在保证金提供程序中返回null,以模拟拆分窗口情况下的C#下拉条行为。如果您决定使用ITextBuffer的属性包,请确保注意投影方案。