2012-06-21 119 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的選項菜單每語言基礎的語言欄:

選項>文本編輯器>語言/所有的語言>選擇/取消「導航欄」。

相關問題