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>
