在WinForm当中,我们可以使用非常轻松地实现系统托盘,在.NET Core的WPF当中,System.Windows.Form
并不能作为命名空间引用,本文将讲述如何在WPF中实现系统托盘,以及如何将窗口最小化到系统托盘。
安装NuGet包
搜索Hardcodet.NotifyIcon.Wpf
并安装:
编写ViewModel
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
| public class NotifyIconViewModel { public ICommand ShowWindowCommand { get { return new DelegateCommand { CommandAction = () => { Application.Current.MainWindow.Activate(); } }; } }
public ICommand HideWindowCommand { get { return new DelegateCommand { CommandAction = () => Application.Current.MainWindow.Hide() }; } }
public ICommand ExitApplicationCommand { get { return new DelegateCommand { CommandAction = () => Application.Current.Shutdown() }; } } }
|
其中,虽然代码中用到了DelegateCommand
类,但实际上并未实际发生作用,只是为了更好地封装代码,增加某些特定条件下的可读性,读者也可自行将其更改为普通的Command。下面为DelegateCommand
类代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| public class DelegateCommand : ICommand { public Action CommandAction { get; set; } public Func<bool> CanExecuteFunc { get; set; }
public void Execute(object parameter) { CommandAction(); }
public bool CanExecute(object parameter) { return CanExecuteFunc == null || CanExecuteFunc(); }
public event EventHandler CanExecuteChanged { add { CommandManager.RequerySuggested += value; } remove { CommandManager.RequerySuggested -= value; } } }
|
在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 11
| public partial class App : Application { public static TaskbarIcon TaskbarIcon;
protected override void OnStartup(StartupEventArgs e) { base.OnStartup(e); TaskbarIcon = (TaskbarIcon)FindResource("Taskbar");
} }
|
然后我们就可以发现,图标已经在系统托盘当中显示了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」