2010-10-25 64 views
4

我一直在開發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幫助)似乎並不是非常廣泛。

回答

1

爲了回答這個問題 - 根據VS團隊的人員的說法,新的可擴展性結構不提供訪問這些控件屬性的方法。對於我想實現的目標,有必要採用老式的方式來獲取DTE對象,找到我的工具欄和我的控件,並簡單地將它們作爲CommandBarButton來處理,就像我在加載項中那樣。