在WinForm当中,我们可以使用非常轻松地实现系统托盘,在.NET Core的WPF当中,System.Windows.Form
并不能作为命名空间引用,本文将讲述如何在WPF中实现系统托盘,以及如何将窗口最小化到系统托盘。
安装NuGet包
搜索Hardcodet.NotifyIcon.Wpf
并安装:
编写ViewModel
1 | public class NotifyIconViewModel |
其中,虽然代码中用到了DelegateCommand
类,但实际上并未实际发生作用,只是为了更好地封装代码,增加某些特定条件下的可读性,读者也可自行将其更改为普通的Command。下面为DelegateCommand
类代码:
1 | public class DelegateCommand : ICommand |
在App.xaml中添加托盘信息并关联ViewModel
在App.xaml添加命名空间:1
xmlns:tb="http://www.hardcodet.net/taskbar"
如果策略并不是隐藏窗口而是直接关闭窗口,那么为了防止所有窗口都退出导致的程序关闭,我们需要添加额外的一行属性:1
ShutdownMode="OnExplicitShutdown"
而不是原来的OnLastWindowClose
。接下来,我们在Application.Resource
标签内添加系统托盘:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17<Application.Resources>
<ContextMenu x:Shared="false" x:Key="SysTrayMenu">
<MenuItem Header="显示窗口" Command="{Binding ShowWindowCommand}" />
<MenuItem Header="关闭窗口" Command="{Binding HideWindowCommand}" />
<Separator />
<MenuItem Header="退出" Command="{Binding ExitApplicationCommand}" />
</ContextMenu>
<tb:TaskbarIcon x:Key="Taskbar"
ToolTipText="UIToy by Haoyun Qin"
DoubleClickCommand="{Binding ShowWindowCommand}"
ContextMenu="{StaticResource SysTrayMenu}"
IconSource="UIToy.ico">
<tb:TaskbarIcon.DataContext>
<local:NotifyIconViewModel />
</tb:TaskbarIcon.DataContext>
</tb:TaskbarIcon>
</Application.Resources>
上面,我们针对不同的操作,绑定了相关的命令。还需要添加一个ico
文件(这里我添加的是UIToy.ico
)
在启动时显示系统托盘
在App.xaml.cs
当中初始化Taskbar
:1
2
3
4
5
6
7
8
9
10
11public partial class App : Application
{
public static TaskbarIcon TaskbarIcon;
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
TaskbarIcon = (TaskbarIcon)FindResource("Taskbar");
}
}
然后我们就可以发现,图标已经在系统托盘当中显示了。