2013-05-14 90 views
2

我在寫一個VS2012加載項,添加一個命令到Build Explorer上下文菜單(請參閱related question)。該命令被添加到2個不同的上下文菜單:確定選擇了哪個Visual Studio上下文菜單?

  1. 生成資源管理
  2. 團隊資源,構建頁面,我的Builds部分

當我的一個回調叫,我怎麼知道這些它是?

我試着獲得集中控制(使用P/Invoke爲this question建議)。但是,它爲(1)提供了一個Tabs容器,而對於(2)則爲null。我可以嘗試將控件投射到標籤容器,但這聽起來很糟糕...

任何更好的選擇?

回答

0

由註釋返工,並建立鏈接:

由於菜單項顯示每一個似乎是沒有辦法將它們之間的不同,從一個外接的地方,你應該添加兩個命令和獨特的他們他們的背景。

而不是將加載項轉換爲VS-Package MZ-Tools HOWTO: Controlling the state of command in a Visual Studio add-in的方式,請嘗試MZ-Tools HOWTO: Use the IVsMonitorSelection ...您也可以從加載項獲取它。

但是:

無論是AddNamedCommand還是QueryStatus方法兌現 不可見狀態:按鈕必須是看不見的...... 仍處於禁用狀態,而不是無形的。

我認爲這樣做不可能通過適當的方式從插件中完成,但也許您可以檢查上下文。

如果您嘗試將命令/菜單遷移到VSPackage併爲菜單項創建自定義UIContext或找到合適的預定義項,則可以採用其他方法獲得更多。我無法訪問使用Build Explorer增強的Studio,因此我無法嘗試它。

下面的討論是關於自定義背景爲VS-包: ​​
可悲的是鏈接從後壞了,我不能達到第1部分和第2部分是關於這個問題的討論從一開始就。 但是,不能保證您可以創建適合您的上下文。

我發現團隊資源管理器的上下文ID是guidTeamProjectCmdUIContext。 它被放置在Visual Studio 2010 SDK中的vsshilds.h中,vsshell * .h也包含其他幾個。

MSDN: Vsct files定義命令,菜單等。從包。物品

Condition屬性:
http://msdn.microsoft.com/en-us/library/bb491718.aspx
http://msdn.microsoft.com/en-us/library/bb166515.aspx

MSDN: VisibilityItem用於命令和工具欄元素。

VisibilityItem元素決定命令和工具欄的靜態可見性。 ...加載VSPackage之後,Visual Studio希望命令可見性由VSPackage而不是VisibilityItem確定。

最後有關預定義上下文的GUID:
http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.shell.interop.uicontextguids80.aspx
http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.shell.interop.uicontextguids.aspx

+0

這並不適用於此:當我加入我的命令,它會自動出現在兩個地方,和AFAIK有沒有辦法告訴命令只出現在其中。這是有道理的 - 這些是VS顯示完全相同的項目的2個地方,所以與項目相關的命令應該出現在兩個地方。 – Jonathan 2013-12-24 09:05:24

+0

如果添加菜單項類似解決方案的上下文菜單,它不知道你要在所有情況下使用它。例如,Tfs命令在簡單的解決方案中是不可見的。但是,如果你想在'UI'或你自己的程序中statets之間的不同,這似乎是它的正確方法。你應該用一個簡單的包來嘗試它,並獲得可用的'UI GIUID's。 – Ursegor 2013-12-26 09:04:50

0

我的新/其他的想法 - 這是與你相似:

你應該嘗試監視的窗口是最後激活。

如果您爲您的命令創建事件處理程序,那麼您可能能夠檢查當您的命令觸發時哪個窗口處於活動狀態。一個命令一個簡單的evenent處理程序:

void cmdEvents_BeforeExecute(string guid, int ID, object customIn, object customOut, ref bool cancelDefault) 
{ 
    Window2 teamExplorer = _applicationObject.Windows.Item("Team Explorer") as Window2; 
    if (_applicationObject.ActiveWindow.Caption == teamExplorer.Caption) 
    { 
     //You are called from Team Explorer 
    } 
    else 
    { 
     //Somewhere else 
    } 
} 

而且方式,您可以訂閱:

static _dispCommandEvents_BeforeExecuteEventHandler _myHandler; 
static CommandEvents _cmdEvents; 

public void OnConnection(...) 
{ 
    Command command = ...; // Init your command 
    int ID = command.ID; 
    string GUID = command.Guid; 

    CommandEvents _cmdEvents = _applicationObject.Events.get_CommandEvents(GUID, ID); 

    _myHandler = new _dispCommandEvents_BeforeExecuteEventHandler(cmdEvents_BeforeExecute); 

    _cmdEvents.BeforeExecute += _myHandler; 
} 

你可以找到一個更好的方式,通過GUID來識別窗口(S)。你應該保持至少_cmdEvents靜態,因爲當它被解析時,你的事件處理程序可能會消失(至少對於內部命令)。

在OnDisconnection中,您應該取消訂閱。

相關問題