Q090. WPF でタスクトレイアイコンを表示するには?
A.WindowsForms の NotifyIcon クラスを使用します。
WPF では残念ながらタスクトレイアイコンの機能が提供されていません。以下の記事で触れられてますが、WPF はプレゼンテーションライブラリだからということで、MS さんはサポートする気がさらさらないようです。
参考記事 : WPFでタスクトレイにアイコンを表示する
WPF で NotifyIcon 使うのは昔から定番らしく、ネットで検索すると様々な記事やサンプルがヒットしましたが VB は見当たらなかったのでサンプルを書いてみました。ついでに Livet を使い NotifyIcon のインスタンスを ViewModel 内で管理するように実装してみました。なにかの参考になれば幸いです。
MainWindowViewModel.vb
Option Explicit On Option Strict On Imports System.Windows.Forms Public Class MainWindowViewModel Inherits ViewModel Private WithEvents _notifyIcon As NotifyIcon #Region "Dispose Support" Protected Overrides Sub Dispose(disposing As Boolean) MyBase.Dispose(disposing) If (disposing) Then _notifyIcon.Dispose() End If End Sub #End Region #Region "イベント" ''' <summary> ''' タスクトレイアイコン・コンテキストメニュークリック時のイベントハンドラ ''' </summary> Private Sub ExitItemClick(sender As Object, e As EventArgs) ' タスクトレイアイコンを終了します _notifyIcon.Dispose() End Sub Private Sub NofityIconBalloonTipClicked(sender As Object, e As EventArgs) Handles _notifyIcon.BalloonTipClicked System.Windows.MessageBox.Show("バルーンがクリックされました!") End Sub #End Region #Region "TrayIconCommand" Private _TrayIconCommand As ViewModelCommand Public ReadOnly Property TrayIconCommand() As ViewModelCommand Get If _TrayIconCommand Is Nothing Then _TrayIconCommand = New ViewModelCommand(AddressOf TrayIcon) End If Return _TrayIconCommand End Get End Property Private Sub TrayIcon() ' バルーンヒントのタイトル _notifyIcon.BalloonTipTitle = "メッセージが届きました!" ' バルーンヒントに表示するメッセージ _notifyIcon.BalloonTipText = "ひらぽん様からお知らせです!" ' バルーンヒントに表示するアイコン _notifyIcon.BalloonTipIcon = ToolTipIcon.Info _notifyIcon.ShowBalloonTip(100000) End Sub #End Region Public Sub Initialize() ' コンテキストメニューを作成 Dim exitItem = New ToolStripMenuItem() With {.Text = "終了"} AddHandler exitItem.Click, AddressOf ExitItemClick Dim menuStrip = New ContextMenuStrip() menuStrip.Items.Add(exitItem) 'タスクトレイアイコンを初期化 _notifyIcon = New NotifyIcon() With { .ContextMenuStrip = menuStrip, .Text = "タスクトレイサンプル", .Icon = New System.Drawing.Icon("app.ico"), .Visible = True } End Sub End Class
MainWindow.xaml
<Window x:Class="MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions" xmlns:l="http://schemas.livet-mvvm.net/2011/wpf" xmlns:local="clr-namespace:TaskTrayVB" Title="MainWindow" Height="180" Width="300"> <Window.DataContext> <local:MainWindowViewModel/> </Window.DataContext> <i:Interaction.Triggers> <!--WindowのContentRenderedイベントのタイミングでViewModelのInitializeメソッドが呼ばれます--> <i:EventTrigger EventName="ContentRendered"> <l:LivetCallMethodAction MethodTarget="{Binding}" MethodName="Initialize"/> </i:EventTrigger> <!--Windowが閉じたタイミングでViewModelのDisposeメソッドが呼ばれます--> <i:EventTrigger EventName="Closed"> <l:DataContextDisposeAction/> </i:EventTrigger> </i:Interaction.Triggers> <Grid> <Button Content="Button" Height="32" Name="Button1" Width="98" Command="{Binding Path=TrayIconCommand}" /> </Grid> </Window>