我一直在開發Visual Studio擴展,作爲VS2008/2010的加載項。新版本現在只能作爲VS2010的VSIX包來使用(因爲它必須是.NET 4),而且我在處理UI時遇到了一些麻煩(相當簡單,我想)。VSPackage:在運行時修改工具欄按鈕文本/工具提示
該擴展主要由一個帶有一些按鈕的工具欄組成,這些按鈕可以啓動各種動作,表單等,還有一些僅用作標籤來顯示某些狀態信息。 「標籤」按鈕本身只顯示非常簡短的信息,而工具提示提供更多細節。
雖然我不認爲整個插件是非常優雅的,但做這種事情非常簡單(雖然我的方法可能有點業餘)。將命令添加到工具欄時,我將「保存」特定局部變量中的「標籤」按鈕,以便隨後可以隨意設置標題和工具提示文本。
在VSPackage的,相當於Microsoft.VisualStudio.CommandBars.CommandBarButton似乎是OleMenuCommand。然而,通過MenuCommandService查找「標籤」命令沒有問題,但是根據需要修改它。
爲了找出如何做到這一點,我只是在一個組中有兩個按鈕的工具欄。 btnAction很簡單;只是一個圖標和執行處理程序來更改另一個按鈕上的文本,而不是CommandFlags。 btnLabel看起來像這樣在.vsct:
<Button guid="guidVSPackageBuilderTutorialCommandSet" id="btnLabel" priority="0x0100">
<CommandFlag>DefaultDisabled</CommandFlag>
<CommandFlag>DontCache</CommandFlag>
<CommandFlag>NoCustomize</CommandFlag>
<CommandFlag>TextChanges</CommandFlag>
<CommandFlag>TextOnly</CommandFlag>
<Strings>
<CommandName>cmdidbtnLabel</CommandName>
<ButtonText>btnLabel</ButtonText>
<MenuText>btnLabel</MenuText>
<ToolTipText>Tooltip btnLabel</ToolTipText>
</Strings>
</Button>
本的第一個問題是,當我使用TextChanges,則的ToolTipText字符串被忽略,ButtonText最初用於工具提示也是如此。
的操作按鈕的處理程序代碼如下:
private int iClickCount = 0;
protected override void btnActionExecuteHandler(object sender, EventArgs e)
{
var svc = GetService(typeof(IMenuCommandService)) as OleMenuCommandService;
CommandID idBtnLabel = new CommandID(GuidList.guidVSPackageBuilderTutorialCmdSet, (int)PkgCmdIDList.btnLabel);
var cmd = svc.FindCommand(idBtnLabel) as OleMenuCommand;
cmd.Text = "Clicked " + (++iClickCount) + " times";
}
這改變的btnLabel標題如預期,但由於沒有明確地指定提示(在OleMenuCommand對象的方式只是有一個文本屬性,不像的CommandBarButton,同時具有標題和的ToolTipText),工具提示是始終使用s模式與標題相同的字符串。據我所知,這是因爲使用FindCommand()我實際上並沒有獲得UI按鈕,而只是基礎命令,它不關心工具提示。
什麼是更令人困惑的是當我使用TextChangesButton CommandFlag而不是TextChanges會發生什麼。該按鈕現在可以正確顯示在.vsct中定義的工具提示文本,但是當我單擊另一個按鈕時,標題和工具提示都不會改變 - 儘管當我檢查btnLabel命令的文本屬性時,它被設置爲我期望(「點擊x次」)。 TextChangesButton類型的「解耦」命令的屬性和按鈕?如果是這樣,這幾乎是我想要的(我不在乎命令,因爲沒有什麼可執行; btnLabel將始終被禁用),但我怎樣才能訪問按鈕及其特定的字符串屬性?
我查看了各種IVs接口和SVs服務,但找不到合適的東西,文檔(和IntelliSense幫助)似乎並不是非常廣泛。