WPF设置托盘图标

正文

添加工具类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
using System;
using System.Drawing;
using System.Windows.Forms;

namespace ColorPicker.Utils
{
public class SystemTray
{
public static SystemTray Instance;

/// <summary>
/// 静态构造函数,在类第一次被创建或者静态成员被调用的时候调用
/// </summary>
static SystemTray()
{
Instance = new SystemTray();
}

public NotifyIcon Ni { get; set; }

private SystemTray()
{
Ni = new System.Windows.Forms.NotifyIcon();

Ni.Icon = new Icon(
System.Windows.Application.GetResourceStream(
new Uri(
"app.ico", UriKind.Relative)
).Stream
);
//Ni.Icon = SystemIcons.Question;
Ni.Visible = true;
Ni.MouseClick += Ni_MouseClick;
}

private void Ni_MouseClick(object sender, MouseEventArgs e)
{
System.Windows.Controls.ContextMenu NotifyIconMenu = (System.Windows.Controls.ContextMenu)App.Current.FindResource("NotifyIconMenu");
if (e.Button == MouseButtons.Right)
{
NotifyIconMenu.IsOpen = true;
}
else
{
NotifyIconMenu.IsOpen = false;
}
}

/// <summary>
/// 销毁系统托盘图标的资源
/// </summary>
public void DisposeNotifyIcon()
{
Ni?.Dispose();
}
}
}

App.xaml

1
2
3
4
5
6
7
8
<Application.Resources>
<ContextMenu x:Key="NotifyIconMenu" StaysOpen="False">
<MenuItem
Name="MenuExit"
Click="MenuExit_Click"
Header="退出" />
</ContextMenu>
</Application.Resources>

App.xaml.cs

1
2
3
4
5
6
7
8
9
10
11
12
13
public partial class App : Application
{
private void MenuExit_Click(object sender, RoutedEventArgs e)
{
SystemTray.Instance.DisposeNotifyIcon();
App.Current.Shutdown();
}

private void Application_Startup(object sender, StartupEventArgs e)
{
_ = SystemTray.Instance;
}
}