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を取得する必要がありますが、それ自体は注意が必要であり、必ずしも信頼できるとは限りません。それを行う方法を示すJaredParsonのVsVimコードを紹介します。このファイルを見ると、IVsTextViewを取得できます。次に、を呼び出してそのファイルをGetWindowFrame取得しIVsWindowFrameます。それができたらを呼び出しGetCodeWindowてを取得しIVsCodeWindowます。次に、それをにキャストしてIVsDropdownBarManager、遊んでみましょう。

  3. 言語サービスの背後で予期しないことをしているので、これはまだ非常にぬるぬるしています。あなたがそれらにこれをしているならば、私は様々な言語サービスがクラッシュするであろうとしても驚かないでしょう。

とは言うものの、ここでの目標が、ナビゲーションバーが気に入らない、または他の何かを試したいという理由で自分自身の単純な拡張を行うことである場合は、これを機能させることができるはずです。しかし、それを行うためのサポートされた/良い方法ではないことは確かです。

于 2012-06-21T16:25:01.117 に答える
0

Visual Studioのオプションメニューから、言語ごとに言語バーを無効/非表示にできます。

オプション>テキストエディタ>言語/すべての言語>[ナビゲーションバー]をオン/オフにします。

于 2013-01-18T16:14:44.447 に答える