ツール ウィンドウにショートカット メニューを追加する
このチュートリアルでは、ツール ウィンドウにショートカット メニューを追加します。 ショートカット メニューは、ユーザーがボタン、テキスト ボックス、またはウィンドウの背景を右クリックしたときに表示されるメニューです。 ショートカット メニューのコマンドは、他のメニューやツール バーのコマンドと同じように動作します。 ショートカット メニューをサポートするには、.vsct ファイルでそれを指定し、マウスの右クリックに応答して表示されるようにします。
ツール ウィンドウは、ToolWindowPane から継承されるカスタム ツール ウィンドウ クラスの WPF ユーザー コントロールで構成されます。
このチュートリアルでは、ショートカット メニューを Visual Studio メニューとして作成する方法について説明します。方法としては、.vsct ファイルでメニュー項目を宣言し、その後、Managed Package Framework を使用して、ツール ウィンドウを定義するクラスにそれらを実装します。 この方法を使用すると、Visual Studio のコマンド、UI 要素、およびオートメーション オブジェクト モデルに簡単にアクセスできるようになります。
なお、ショートカット メニューから Visual Studio の機能にアクセスしない場合は、ユーザー コントロールで XAML 要素の ContextMenu プロパティを使用することもできます。 詳細については、「ContextMenu」をご覧ください。
ツール ウィンドウのショートカット メニュー パッケージを作成する
TWShortcutMenu
という VSIX プロジェクトを作成し、それに ShortcutMenu というツール ウィンドウ テンプレートを追加します。 ツール ウィンドウの作成について詳しくは、「ツール ウィンドウで拡張機能を作成する」をご覧ください。
ショートカット メニューの指定
このチュートリアルに示すようなショートカット メニューを追加すると、ツール ウィンドウの背景の塗りつぶしに使用する色の一覧から、ユーザーが色を選択できるようになります。
ShortcutMenuPackage.vsct で、guidShortcutMenuPackageCmdSet という GuidSymbol 要素を探し、ショートカット メニュー、ショートカット メニュー グループ、およびメニュー オプションを宣言します。 GuidSymbol 要素のコードは、次のようになります。
<GuidSymbol name="guidShortcutMenuPackageCmdSet" value="{00000000-0000-0000-0000-0000}"> // your GUID here <IDSymbol name="ShortcutMenuCommandId" value="0x0100" /> <IDSymbol name="ColorMenu" value="0x1000"/> <IDSymbol name="ColorGroup" value="0x1100"/> <IDSymbol name="cmdidRed" value="0x102"/> <IDSymbol name="cmdidYellow" value="0x103"/> <IDSymbol name="cmdidBlue" value="0x104"/> </GuidSymbol>
Buttons 要素の直前に、Menus 要素を作成し、その中にショートカット メニューを定義します。
<Menus> <Menu guid="guidShortcutMenuPackageCmdSet" id="ColorMenu" type="Context"> <Strings> <ButtonText>Color change</ButtonText> <CommandName>ColorChange</CommandName> </Strings> </Menu> </Menus>
ショートカット メニューは、メニューやツール バーの一部ではないため、親はありません。
Groups 要素と、ショートカット メニュー項目を含んだ Group 要素を作成し、グループをショートカット メニューに関連付けます。
<Groups> <Group guid="guidShortcutMenuPackageCmdSet" id="ColorGroup"> <Parent guid="guidShortcutMenuPackageCmdSet" id="ColorMenu"/> </Group> </Groups>
Buttons 要素で、ショートカット メニューに表示される個々のコマンドを定義します。 Buttons 要素は次のようになります。
<Buttons> <Button guid="guidShortcutMenuPackageCmdSet" id="ShortcutMenuCommandId" priority="0x0100" type="Button"> <Parent guid="guidSHLMainMenu" id="IDG_VS_WNDO_OTRWNDWS1"/> <Icon guid="guidImages" id="bmpPic1" /> <Strings> <ButtonText>ShortcutMenu</ButtonText> </Strings> </Button> <Button guid="guidShortcutMenuPackageCmdSet" id="cmdidRed" priority="1" type="Button"> <Parent guid="guidShortcutMenuPackageCmdSet" id="ColorGroup" /> <Strings> <ButtonText>Red</ButtonText> </Strings> </Button> <Button guid="guidShortcutMenuPackageCmdSet" id="cmdidYellow" priority="3" type="Button"> <Parent guid="guidShortcutMenuPackageCmdSet" id="ColorGroup" /> <Strings> <ButtonText>Yellow</ButtonText> </Strings> </Button> <Button guid="guidShortcutMenuPackageCmdSet" id="cmdidBlue" priority="5" type="Button"> <Parent guid="guidShortcutMenuPackageCmdSet" id="ColorGroup" /> <Strings> <ButtonText>Blue</ButtonText> </Strings> </Button> </Buttons>
ShortcutMenuCommand.cs で、コマンド セット GUID、ショートカット メニュー、およびメニュー項目の定義を追加します。
public const string guidShortcutMenuPackageCmdSet = "00000000-0000-0000-0000-00000000"; // your GUID will differ public const int ColorMenu = 0x1000; public const int cmdidRed = 0x102; public const int cmdidYellow = 0x103; public const int cmdidBlue = 0x104;
これらのコマンド ID は、ShortcutMenuPackage.vsct ファイルの Symbols セクションで定義されているものと同じです。 ここには、コンテキスト グループは含まれていません。コンテキスト グループは、.vsct ファイルでのみ必要です。
ショートカット メニューの実装
このセクションでは、ショートカット メニューとそのコマンドを実装します。
ShortcutMenu.cs では、ツール ウィンドウでメニュー コマンド サービスを取得できますが、それに含まれるコントロールは取得できません。 次の手順は、メニュー コマンド サービスをユーザー コントロールで使用できるようにする方法を示したものです。
ShortcutMenu.cs で、次の using ディレクティブを追加します。
using Microsoft.VisualStudio.Shell; using System.ComponentModel.Design;
ツール ウィンドウの Initialize() メソッドをオーバーライドしてメニュー コマンド サービスを取得し、コントロールを追加して、メニュー コマンド サービスをコンストラクターに渡します。
protected override void Initialize() { var commandService = (OleMenuCommandService)GetService(typeof(IMenuCommandService)); Content = new ShortcutMenuControl(commandService); }
ShortcutMenu ツール ウィンドウ コンストラクターで、コントロールを追加する行を削除します。 コンストラクターは次のようになります。
public ShortcutMenu() : base(null) { this.Caption = "ShortcutMenu"; this.BitmapResourceID = 301; this.BitmapIndex = 1; }
ShortcutMenuControl.xaml.cs で、メニュー コマンド サービスのプライベート フィールドを追加し、メニュー コマンド サービスを取得するようにコントロールのコンストラクターを変更します。 次に、メニュー コマンド サービスを使用して、コンテキスト メニューのコマンドを追加します。 ShortcutMenuControl のコンストラクターは次のコードのようになります。 コマンド ハンドラーは後から定義されます。
public ShortcutMenuControl(OleMenuCommandService service) { this.InitializeComponent(); commandService = service; if (null !=commandService) { // Create an alias for the command set guid. Guid guid = new Guid(ShortcutMenuCommand.guidShortcutMenuPackageCmdSet); // Create the command IDs. var red = new CommandID(guid, ShortcutMenuCommand.cmdidRed); var yellow = new CommandID(guid, ShortcutMenuCommand.cmdidYellow); var blue = new CommandID(guid, ShortcutMenuCommand.cmdidBlue); // Add a command for each command ID. commandService.AddCommand(new MenuCommand(ChangeColor, red)); commandService.AddCommand(new MenuCommand(ChangeColor, yellow)); commandService.AddCommand(new MenuCommand(ChangeColor, blue)); } }
ShortcutMenuControl.xaml で、最上位レベルの UserControl 要素に MouseRightButtonDown イベントを追加します。 XAML ファイルは次のようになります。
<UserControl x:Class="TWShortcutMenu.ShortcutMenuControl" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" Background="{DynamicResource VsBrush.Window}" Foreground="{DynamicResource VsBrush.WindowText}" mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="300" Name="MyToolWindow" MouseRightButtonDown="MyToolWindow_MouseRightButtonDown"> <Grid> <StackPanel Orientation="Vertical"> <TextBlock Margin="10" HorizontalAlignment="Center">ShortcutMenu</TextBlock> </StackPanel> </Grid> </UserControl>
ShortcutMenuControl.xaml.cs で、イベント ハンドラーのスタブを追加します。
private void MyToolWindow_MouseRightButtonDown(object sender, MouseButtonEventArgs e) { . . . }
同じファイルに、次の using ディレクティブを追加します。
using Microsoft.VisualStudio.Shell; using System.ComponentModel.Design; using System; using System.Windows.Input; using System.Windows.Media;
次のように、
MyToolWindowMouseRightButtonDown
イベントを実装します。private void MyToolWindow_MouseRightButtonDown(object sender, MouseButtonEventArgs e) { if (null != commandService) { CommandID menuID = new CommandID( new Guid(ShortcutMenuCommand.guidShortcutMenuPackageCmdSet), ShortcutMenuCommand.ColorMenu); Point p = this.PointToScreen(e.GetPosition(this)); commandService.ShowContextMenu(menuID, (int)p.X, (int)p.Y); } }
これにより、ショートカット メニューの CommandID オブジェクトが作成され、マウス クリックの位置が識別されて、ShowContextMenu メソッドを使ってその場所でショートカット メニューが開くようになります。
コマンド ハンドラーを実装します。
private void ChangeColor(object sender, EventArgs e) { var mc = sender as MenuCommand; switch (mc.CommandID.ID) { case ShortcutMenuCommand.cmdidRed: MyToolWindow.Background = Brushes.Red; break; case ShortcutMenuCommand.cmdidYellow: MyToolWindow.Background = Brushes.Yellow; break; case ShortcutMenuCommand.cmdidBlue: MyToolWindow.Background = Brushes.Blue; break; } }
この例の場合、CommandID を識別し、背景色を適切に設定することで、すべてのメニュー項目のイベントが 1 つのメソッドによって処理されます。 メニュー項目に関連しないコマンドが含まれている場合は、コマンドごとに個別のイベント ハンドラーを作成していることになります。
ツール ウィンドウの機能をテストする
プロジェクトをビルドし、デバッグを開始します。 実験用インスタンスが表示されます。
実験用インスタンスで、[表示]/[その他のウィンドウ] をクリックし、[ShortcutMenu] をクリックします。 これを行うと、ツール ウィンドウが表示されます。
ツール ウィンドウの本体を右クリックします。 色の一覧を含んだショートカット メニューが表示されます。
ショートカット メニューで色をクリックします。 ツール ウィンドウの背景色が、選択した色に変更されます。