Skip to content

Commit 1e16abc

Browse files
committed
增加了WPF应用最小化到系统托盘笔记
1 parent 0bc84d2 commit 1e16abc

File tree

1 file changed

+132
-0
lines changed

1 file changed

+132
-0
lines changed
Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
# WPF应用最小化到系统托盘
2+
3+
## 前言
4+
5+
在现代桌面应用开发中,<span style="color: dodgerblue;">系统托盘(System Tray)</span>功能已经成为用户体验的重要组成部分。特别是对于需要长时间运行的应用程序,如即时通讯工具、音乐播放器、系统监控工具等,最小化到系统托盘不仅可以节省任务栏空间,还能让应用在后台持续运行,随时为用户提供服务。
6+
7+
本文以[Rouyan](https://github.com/Ming-jiayou/Rouyan)这个WPF应用为例,说明在WPF中如何实现最小化到系统托盘。
8+
9+
## 选择
10+
11+
在WPF中实现系统托盘功能,开发者通常有以下几种选择:
12+
13+
*1、System.Windows.Forms.NotifyIcon:最传统的方式,需要引用WinForms*
14+
15+
*2、Hardcodet.NotifyIcon.Wpf:专为WPF设计的托盘组件*
16+
17+
*3、H.NotifyIcon.Wpf:Hardcodet的现代维护版本*
18+
19+
这里我选择的是<span style="color: dodgerblue;">H.NotifyIcon.Wpf</span>,选择H.NotifyIcon.Wpf的优势:
20+
21+
*1、现代化维护:相比原版Hardcodet,H.NotifyIcon.Wpf有更活跃的维护和bug修复*
22+
23+
*2、完全兼容:保留了原版的API和XAML命名空间,迁移成本为零*
24+
25+
*3、WPF原生:无需引入WinForms依赖,与WPF的数据绑定和样式系统完美集成*
26+
27+
*4、功能丰富:支持气泡提示、上下文菜单、多种鼠标事件等*
28+
29+
H.NotifyIcon.Wpf项目地址:*https://github.com/HavenDV/H.NotifyIcon*
30+
31+
![](https://files.mdnice.com/user/50031/35eba36e-2a6f-42ec-9e61-9f922369911e.png)
32+
33+
## 使用
34+
35+
36+
先描述一下,我们想要实现的效果,我想要点击最小化与关闭的时候,让这个应用最小化到系统托盘,然后点击系统托盘的图标显示这个应用,或者右键系统托盘的图标,有两个选项,一个是显示窗口,一个是退出,点击退出才真的退出程序。
37+
38+
第一步安装nuget包:
39+
40+
![](https://files.mdnice.com/user/50031/63fae3fb-1999-4837-bd96-05c561c087eb.png)
41+
42+
第二步在主窗口中添加控件:
43+
44+
先添加`xmlns:tb="http://www.hardcodet.net/taskbar"``StateChanged="Window_StateChanged"`
45+
46+
47+
![](https://files.mdnice.com/user/50031/c2d3c8ed-8224-48c8-91b7-785a2d70b7c5.png)
48+
49+
50+
```xaml
51+
<!-- 系统托盘图标 -->
52+
<tb:TaskbarIcon x:Name="TrayIcon"
53+
IconSource="/Assets/福州肉燕.ico"
54+
ToolTipText="Rouyan"
55+
TrayLeftMouseDown="TrayIcon_TrayLeftMouseDown">
56+
<tb:TaskbarIcon.ContextMenu>
57+
<ContextMenu>
58+
<MenuItem Header="显示窗口" Click="ShowWindow_Click"/>
59+
<Separator/>
60+
<MenuItem Header="退出" Click="ExitApp_Click"/>
61+
</ContextMenu>
62+
</tb:TaskbarIcon.ContextMenu>
63+
</tb:TaskbarIcon>
64+
```
65+
ToolTipText是你鼠标悬浮在图标那会出现的文字,TrayLeftMouseDown是鼠标左键点击系统托盘图标事件,ContextMenu是右键系统托盘图标会出现的选项。
66+
67+
现在在code-behind也就是主页面的xaml.cs中写这些事件处理程序即可。
68+
69+
首先关闭应用时,让其不关闭而是最小化:
70+
71+
```csharp
72+
protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
73+
{
74+
e.Cancel = true;
75+
WindowState = WindowState.Minimized;
76+
}
77+
```
78+
79+
然后是窗体改变事件处理程序:
80+
81+
```csharp
82+
private void Window_StateChanged(object sender, System.EventArgs e)
83+
{
84+
if (WindowState == WindowState.Minimized)
85+
{
86+
Hide();
87+
TrayIcon.Visibility = Visibility.Visible;
88+
}
89+
}
90+
```
91+
92+
鼠标左键点击系统托盘图标:
93+
94+
```csharp
95+
private void TrayIcon_TrayLeftMouseDown(object sender, RoutedEventArgs e)
96+
{
97+
ShowMainWindow();
98+
}
99+
100+
private void ShowMainWindow()
101+
{
102+
Show();
103+
WindowState = WindowState.Normal;
104+
Activate();
105+
TrayIcon.Visibility = Visibility.Collapsed;
106+
}
107+
```
108+
109+
鼠标右键系统托盘出现的显示窗口与退出的事件处理程序:
110+
111+
```csharp
112+
private void ShowWindow_Click(object sender, RoutedEventArgs e)
113+
{
114+
ShowMainWindow();
115+
}
116+
117+
private void ExitApp_Click(object sender, RoutedEventArgs e)
118+
{
119+
TrayIcon.Dispose();
120+
Application.Current.Shutdown();
121+
}
122+
```
123+
124+
全部代码:
125+
126+
![](https://files.mdnice.com/user/50031/3b550e81-613e-410d-bf25-ce751ec9d4f3.png)
127+
128+
项目地址:https://github.com/Ming-jiayou/Rouyan
129+
130+
最终效果:
131+
132+
这样就成功实现了在WPF应用中实现最小化到系统托盘,希望对你有所帮助。

0 commit comments

Comments
 (0)