2

这是目标:通过扩展删除某些编辑器中的导航栏(不是所有的,因为在选项中是可能的)。

所以这是我要删除的东西: 导航栏

我检查了很多方法,最有希望的是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
}

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

虚拟树

但这是一个非常肮脏和不可靠的解决方案。你知道更好的吗?特别是如果有一个扩展点(如其中之一:编辑器扩展点)来操作它。

4

2 回答 2

1

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

这种方法存在一些问题:

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

  2. 您需要获取给定窗口的 IVsCodeWindow,这本身很棘手且不一定可靠。我会向你指出 Jared Parson 的 VsVim 代码,它展示了如何做到这一点。如果你查看这个文件,你可以得到一个 IVsTextView,然后调用它GetWindowFrame来获取IVsWindowFrame它。一旦你有了那个,然后打电话GetCodeWindow去拿IVsCodeWindow。然后将其投射到IVsDropdownBarManager并开始玩耍。

  3. 这仍然非常棘手,因为您在语言服务背后做着它可能无法预料的事情。如果您对它们这样做,如果各种语言服务会崩溃,我不会感到惊讶。

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

于 2012-06-21T16:25:01.117 回答
0

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

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

于 2013-01-18T16:14:44.447 回答