VSパッケージ:実行時にツールバーボタンのテキスト/ツールチップを変更する
-
26-09-2019 - |
質問
私は、VS2008/2010 のアドインとして Visual Studio 拡張機能を開発してきました。現在の新しいバージョンは、VS2010 専用の VSIX パッケージとして作成されることになっており (とにかく .NET 4 である必要があるため)、UI の処理 (かなり単純だと思います) でいくつかの問題を抱えています。
この拡張機能は主に、さまざまなアクションやフォームなどを起動するいくつかのボタンを備えたツールバーと、いくつかの状態情報を表示するためのラベルとしてのみ使用されるいくつかのボタンで構成されます。「ラベル」ボタン自体は非常に短く簡潔な情報を表示するだけですが、ツールチップにはより詳細な情報が表示されます。
アドイン全体がそれほど洗練されているとは思いませんでしたが、この種のことを行うのは非常に簡単でした (私のアプローチは少し素人っぽかったかもしれませんが)。ツールバーにコマンドを追加するときは、「ラベル」ボタンを特定のローカル変数に「保存」し、後でキャプションやツールヒントのテキストを自由に設定できるようにします。
VSPackage では、次と同等です。 Microsoft.VisualStudio.CommandBars.CommandBarButton であるように見えます オレメニューコマンド. 。「label」コマンドを見つけるには、 メニューコマンドサービス ただし、必要に応じて変更することは問題ありません。
これを行う方法を調べるために、グループ内に 2 つのボタンを備えたツールバーを用意しました。 btnアクション とてもシンプルです。アイコンと他のボタンのテキストを変更するための実行ハンドラーのみであり、CommandFlags はありません。btnラベル .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>
これに関する最初の問題は、使用するとき テキストの変更, 、 ツールチップテキスト 文字列は無視され、 ボタンテキスト 最初はツールチップにも使用されます。
アクション ボタンのハンドラー コードは次のとおりです。
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";
}
これにより、キャプションが変更されます btnラベル 予想通りですが、ツールチップを明示的に指定する方法がないため( オレメニューコマンド オブジェクトにはちょうど 文章 財産とは異なり、 コマンドバーボタン, 、両方を備えています キャプション そして ツールチップテキスト)、ツールヒントは常にキャプションと同じ文字列に設定されます。私が理解しているところによると、これは FindCommand() を使用すると実際には UI ボタンを取得せず、ツールヒントを気にしない基になるコマンドのみを取得しているためです。
さらに混乱するのは、 テキスト変更ボタン 代わりに CommandFlag テキストの変更. 。ボタンには .vsct で定義されたツールヒント テキストが正しく表示されるようになりましたが、他のボタンをクリックしてもキャプションもツールヒントも変化しません。ただし、 btnラベル コマンドの 文章 プロパティでは、期待どおり (「クリック x 回」) に設定されています。する テキスト変更ボタン コマンドとボタンのプロパティを「切り離す」ようなものですか?もしそうであれば、これはほぼ私が望んでいることです (とにかく実行するものがないので、コマンドについては気にしません。 btnラベル は常に無効になります)、ボタンとその特定の文字列プロパティにアクセスするにはどうすればよいですか?
さまざまな IV インターフェイスと SV サービスを調べましたが、適切なものが見つかりませんでした。また、ドキュメント (および IntelliSense ヘルプ) もあまり充実していないようです。
解決
この自分自身を答えるために - VSチームの誰かによると、新しい拡張性構造は、このような詳細にコントロールのこれらのプロパティにアクセスする方法を提供していません。私は私のアドインでやったように、私が達成したいもののために私のツールバーと私のコントロールを見つけ、DTEオブジェクトのホールドを取得する昔ながらの道を行くことが必要であろうと、単にCommandBarButtonsとしてそれらを扱います。