2012-06-21 93 views
1

这是一个目标:在一些编辑器中删除导航栏(因为在选项中可能没有所有这些),所以需要使用扩展名。是否有任何扩展点来操作Visual Studio导航栏?

所以这是它,我要删除的东西: 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)来操作它。

回答

0

因此,语言服务用来操纵下拉条内容的API是IVsDropdownBarManager。如果您在适当的时间调用RemoveDropdownBar,并且下拉栏将被删除,并且您不必去玩WPF可视化树。

有几个问题,这种方法:

  1. “适当的时候”没有明确定义,而且每种语言服务可以初始化它在不同的时间下拉条。大多数语言服务将在IVsCodeWindow的AddAdorments阶段执行此操作,但这不是您可以接入的内容。

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

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

也就是说,如果你在这里的目标是让你自己一个简单的扩展,因为你不喜欢的导航栏,或想尝试别的东西,你应该能够得到这个工作。但它肯定不是一种支持/很好的做法。

0

可以禁用/隐藏从Visual Studio的选项菜单每语言基础的语言栏:

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

相关问题