这是我们的目标:通过扩展程序删除某些编辑器中的导航栏(在“选项”中不是所有编辑器)。
所以这就是我要删除的内容:
我检查了很多方法,最有希望的方法是在加载后在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
}
然后在可视树中向上遍历找到导航栏并将其隐藏在那里:
但这是一个非常肮脏和不可靠的解决方案。你知道更好吗?特别是如果有一个扩展点(就像其中一个:Editor Extension Points)来操纵它。
答案 0 :(得分:1)
因此,语言服务用于操作下拉栏内容的API为IVsDropdownBarManager
。如果您在适当的时间调用了RemoveDropdownBar,并且删除了下拉栏,您不必再使用WPF可视化树。
这种方法存在一些问题:
“适当的时间”没有明确定义,并且每个语言服务可能会在不同的时间初始化它的下拉栏。大多数语言服务都会在IVsCodeWindow
的AddAdorments阶段执行此操作,但这不是您可以使用的内容。
您需要获取给定窗口的IVsCodeWindow,这本身很棘手且不一定可靠。我会指出Jared Parson的VsVim代码,它展示了如何做到这一点。如果您查看this file,则可以获得IVsTextView,然后致电GetWindowFrame
获取IVsWindowFrame
。 之后,请致电GetCodeWindow
以获取IVsCodeWindow
。然后将其转换为IVsDropdownBarManager
并开始游戏。
这仍然是非常粘糊糊的,因为你正在做语言服务背后的事情,它可能没有预料到。如果您对他们这样做,各种语言服务会崩溃,我不会感到惊讶。
那就是说,如果你的目标是为自己做一个简单的扩展,因为你不喜欢导航条或想尝试别的东西,你应该能够让它工作。但它确实不是一种支持/好的方式。
答案 1 :(得分:0)
您可以从Visual Studio的选项菜单中按语言禁用/隐藏语言栏:
选项>文本编辑器> 语言/所有语言>选中/取消选中“导航栏”。