2013-11-25 38 views
2

我正在爲VS 2012編寫一個C#插件。 我想將一個菜單項添加到工具菜單中。我希望這個菜單項在Studio啓動時被禁用,並且根據是否加載瞭解決方案/項目而變爲啓用或禁用。Visual Studio加載項。如何禁用菜單項

我以前可以通過處理QueryStatus方法並在適當時將 狀態設置爲vsCommandStatus.vsCommandStatusEnabled來完成此操作。 問題是由於某種原因QueryStatus不再被調用,直到我點擊菜單「工具」,因此我不能禁用我的菜單項。 任何人都可以幫忙嗎?

我通過處理的OnConnection

if(connectMode == ext_ConnectMode.ext_cm_UISetup) 
{ 
........ 
} 

和我的插件XML連接到我的插件看起來像

<LoadBehavior>1</LoadBehavior> 
<CommandPreload>1</CommandPreload> 
<CommandLineSafe>0</CommandLineSafe> 

回答

0

這裏有一個類似的問題UISetupSocial.MSDN: Visual Studio no longer sends ext_cm_UISetup

注意ext_ConnectMode .ext_cm_UISetup在整個生命週期中僅被觸發一次計算機上的加載項,也就是說,每次加載加載時都不會觸發它。標誌ext_ConnectMode.ext_cm_UISetup僅用於永久創建永久用戶界面。

雖然未加載加載項,但無法管理通過QueryStatus的菜單項。

關於UISetupMZ-Tools HOWTO: Controlling the state of command in a Visual Studio add-in

對於這種類型的加載項與永久的用戶界面,因爲你 將獨立的 加載項是否被加載或不想要的命令相同的狀態,您必須確保AddNamedCommand調用中的ContextUIGUIDs/vsCommandDisabledFlagsValue參數的邏輯與QueryStatus方法的邏輯相同。

所以,我認爲你應該使用非永久按鈕:

if(connectMode == ext_ConnectMode.ext_cm_AfterStartup || connectMode == ext_ConnectMode.ext_cm_Startup) 
{ 
    ... 
} 

,或者你可以設置UIContext正常。不加載加載項時不應調用查詢狀態,它可能會被更正。

如果您創建非永久性按鈕,它們將在加載加載項時顯示爲正確狀態,那麼您應該刪除它們。我之前使用過這個解決方案

此解決方案可能會導致您在加載項卸載後特殊情況下留下幾個垃圾按鈕。我無法找到工作解決方案來始終清理它們。但他們可以手動刪除好。

0

直到菜單項即將顯示時,纔會調用QueryStatus,但這不應該成爲問題,因爲用戶無法看到菜單項被禁用,直到顯示爲止。如果您擔心用戶可能使用熱鍵執行該命令,那麼只需檢查命令是否可用於Execute方法。