WPF應用最小化到系統(tǒng)托盤
前言
在現(xiàn)代桌面應用開發(fā)中,系統(tǒng)托盤(System Tray)功能已經(jīng)成為用戶體驗的重要組成部分。特別是對于需要長時間運行的應用程序,如即時通訊工具、音樂播放器、系統(tǒng)監(jiān)控工具等,最小化到系統(tǒng)托盤不僅可以節(jié)省任務欄空間,還能讓應用在后臺持續(xù)運行,隨時為用戶提供服務。
本文以Rouyan這個WPF應用為例,說明在WPF中如何實現(xiàn)最小化到系統(tǒng)托盤。
選擇
在WPF中實現(xiàn)系統(tǒng)托盤功能,開發(fā)者通常有以下幾種選擇:
1、System.Windows.Forms.NotifyIcon:最傳統(tǒng)的方式,需要引用WinForms
2、Hardcodet.NotifyIcon.Wpf:專為WPF設計的托盤組件
3、H.NotifyIcon.Wpf:Hardcodet的現(xiàn)代維護版本
這里我選擇的是H.NotifyIcon.Wpf,選擇H.NotifyIcon.Wpf的優(yōu)勢:
1、現(xiàn)代化維護:相比原版Hardcodet,H.NotifyIcon.Wpf有更活躍的維護和bug修復
2、完全兼容:保留了原版的API和XAML命名空間,遷移成本為零
3、WPF原生:無需引入WinForms依賴,與WPF的數(shù)據(jù)綁定和樣式系統(tǒng)完美集成
4、功能豐富:支持氣泡提示、上下文菜單、多種鼠標事件等
H.NotifyIcon.Wpf項目地址:https://github.com/HavenDV/H.NotifyIcon

使用
先描述一下,我們想要實現(xiàn)的效果,我想要點擊最小化與關閉的時候,讓這個應用最小化到系統(tǒng)托盤,然后點擊系統(tǒng)托盤的圖標顯示這個應用,或者右鍵系統(tǒng)托盤的圖標,有兩個選項,一個是顯示窗口,一個是退出,點擊退出才真的退出程序。
第一步安裝nuget包:

第二步在主窗口中添加控件:
先添加xmlns:tb="http://www.hardcodet.net/taskbar"與StateChanged="Window_StateChanged"。

<!-- 系統(tǒng)托盤圖標 -->
<tb:TaskbarIcon x:Name="TrayIcon"
IconSource="/Assets/福州肉燕.ico"
ToolTipText="Rouyan"
TrayLeftMouseDown="TrayIcon_TrayLeftMouseDown">
<tb:TaskbarIcon.ContextMenu>
<ContextMenu>
<MenuItem Header="顯示窗口" Click="ShowWindow_Click"/>
<Separator/>
<MenuItem Header="退出" Click="ExitApp_Click"/>
</ContextMenu>
</tb:TaskbarIcon.ContextMenu>
</tb:TaskbarIcon>
ToolTipText是你鼠標懸浮在圖標那會出現(xiàn)的文字,TrayLeftMouseDown是鼠標左鍵點擊系統(tǒng)托盤圖標事件,ContextMenu是右鍵系統(tǒng)托盤圖標會出現(xiàn)的選項。
現(xiàn)在在code-behind也就是主頁面的xaml.cs中寫這些事件處理程序即可。
首先關閉應用時,讓其不關閉而是最小化:
protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
{
e.Cancel = true;
WindowState = WindowState.Minimized;
}
然后是窗體改變事件處理程序:
private void Window_StateChanged(object sender, System.EventArgs e)
{
if (WindowState == WindowState.Minimized)
{
Hide();
TrayIcon.Visibility = Visibility.Visible;
}
}
鼠標左鍵點擊系統(tǒng)托盤圖標:
private void TrayIcon_TrayLeftMouseDown(object sender, RoutedEventArgs e)
{
ShowMainWindow();
}
private void ShowMainWindow()
{
Show();
WindowState = WindowState.Normal;
Activate();
TrayIcon.Visibility = Visibility.Collapsed;
}
鼠標右鍵系統(tǒng)托盤出現(xiàn)的顯示窗口與退出的事件處理程序:
private void ShowWindow_Click(object sender, RoutedEventArgs e)
{
ShowMainWindow();
}
private void ExitApp_Click(object sender, RoutedEventArgs e)
{
TrayIcon.Dispose();
Application.Current.Shutdown();
}
全部代碼:

項目地址:https://github.com/Ming-jiayou/Rouyan
最終效果:

這樣就成功實現(xiàn)了在WPF應用中實現(xiàn)最小化到系統(tǒng)托盤,希望對你有所幫助。

浙公網(wǎng)安備 33010602011771號