是否有任何扩展点来操纵Visual Studio导航栏?

时间:2012-06-21 13:36:16

标签: visual-studio vsix visual-studio-extensions

这是我们的目标:通过扩展程序删除某些编辑器中的导航栏(在“选项”中不是所有编辑器)。

所以这就是我要删除的内容: Navigation bar

我检查了很多方法,最有希望的方法是在加载后在IWpfTextViewMargin中访问它:

IWpfTextViewHost TextViewHost;
IWpfTextViewMargin ContainerMargin;

public DummyMargin(IWpfTextViewHost textViewHost, 
                   IWpfTextViewMargin containerMargin)
{
    this.TextViewHost = textViewHost;
    this.ContainerMargin = containerMargin;
    Loaded += DummyMargin_Loaded;

}

void DummyMargin_Loaded(object sender, System.Windows.RoutedEventArgs e)
{
    // ContainerMargin is loaded here
}

然后在可视树中向上遍历找到导航栏并将其隐藏在那里:

Virtual Tree

但这是一个非常肮脏和不可靠的解决方案。你知道更好吗?特别是如果有一个扩展点(就像其中一个:Editor Extension Points)来操纵它。

2 个答案:

答案 0 :(得分:1)

因此,语言服务用于操作下拉栏内容的API为IVsDropdownBarManager。如果您在适当的时间调用了RemoveDropdownBar,并且删除了下拉栏,您不必再使用WPF可视化树。

这种方法存在一些问题:

  1. “适当的时间”没有明确定义,并且每个语言服务可能会在不同的时间初始化它的下拉栏。大多数语言服务都会在IVsCodeWindow的AddAdorments阶段执行此操作,但这不是您可以使用的内容。

  2. 您需要获取给定窗口的IVsCodeWindow,这本身很棘手且不一定可靠。我会指出Jared Parson的VsVim代码,它展示了如何做到这一点。如果您查看this file,则可以获得IVsTextView,然后致电GetWindowFrame获取IVsWindowFrame 之后,请致电GetCodeWindow以获取IVsCodeWindow。然后将其转换为IVsDropdownBarManager并开始游戏。

  3. 这仍然是非常粘糊糊的,因为你正在做语言服务背后的事情,它可能没有预料到。如果您对他们这样做,各种语言服务会崩溃,我不会感到惊讶。

  4. 那就是说,如果你的目标是为自己做一个简单的扩展,因为你不喜欢导航条或想尝试别的东西,你应该能够让它工作。但它确实不是一种支持/好的方式。

答案 1 :(得分:0)

您可以从Visual Studio的选项菜单中按语言禁用/隐藏语言栏:

选项>文本编辑器> 语言/所有语言>选中/取消选中“导航栏”。