
1 シンプルな要件
- オープンソースのコントロールライブラリを使用する
- XAML でトレイメニューを宣言する。コントロールに ContextMenu を追加するのと同じように
- よく使うコマンドをカプセル化: メインウィンドウを開く、アプリケーションを終了するなど

TerminalMACS にトレイメニューを追加しました。最終的なトレイメニューの効果は次の通りです:


2 実行方法
【Step 1】作成済みの WPF プロジェクトに HandyControl ライブラリを追加し、インストールします:

なぜ HC コントロールライブラリを使うのか?まずはデモ効果を見てみましょう:



一般的なトレイ効果はすべて満たせるはずです。これらの効果を実現するために、自分で書くコードは本当に少なくて済みます。HC がすでにカプセル化しているので、直接使用するだけです。
【Step 2】フォームに HandyControl 名前空間を追加します
xmlns:hc="https://handyorg.github.io/handycontrol"
【Step 3】トレイメニューを宣言する重要な 19 行のコード
<hc:NotifyIcon x:Name="NotifyIconContextContent"
Text="{markup:I18n {x:Static i18NResources:Language.AppTitle}}"
Visibility="Visible"
Icon="/Images/logo.ico">
<hc:NotifyIcon.ContextMenu>
<ContextMenu>
<MenuItem Command="hc:ControlCommands.PushMainWindow2Top" Header="{markup:I18n {x:Static i18NResources:Language.PushMainWindow2Top}}"/>
<MenuItem Command="hc:ControlCommands.ShutdownApp" Header="{markup:I18n {x:Static i18NResources:Language.Exit}}"/>
</ContextMenu>
</hc:NotifyIcon.ContextMenu>
<hc:Interaction.Triggers>
<hc:EventTrigger EventName="Click">
<hc:EventToCommand Command="hc:ControlCommands.PushMainWindow2Top"/>
</hc:EventTrigger>
</hc:Interaction.Triggers>
</hc:NotifyIcon>
上記のコードで、トレイメニューはほぼ完成です。簡単に説明します:
- NotifyIcon はトレイメニューコントロールで、Text はトレイメニュー名を表示します。マウスをトレイアイコンに置くと、ToolTip にその文字列が表示され、通常はアプリケーション名を表示します。下図の通り:

- hc:NotifyIcon.ContextMenu はメニュー項目を宣言するために使います。このプロジェクトでは現在、メインウィンドウを開く、アプリケーションを終了するの2つのメニューを追加しています。これらのコマンドは HC がすでにカプセル化しており、使いやすいです。 - さらに、トレイメニューをクリックすると、アプリケーションのメインウィンドウを表示することもできます。
【Step 4】メインウィンドウを手動で閉じるときは、非表示にして終了しない
トレイメニューを追加した後、メインウィンドウを閉じる際には、OnClosing イベントをオーバーライドして、直接閉じるのではなく、メインウィンドウを非表示にするべきです。
protected override void OnClosing(CancelEventArgs e)
{
this.Hide();
e.Cancel = true;
}
3 詳細情報
詳細なデモソースコードは HandyControl を参照してください。
本記事のソースコード: TerminalMACS