当前位置: 首页 > news >正文

WPF应用最小化到系统托盘

前言

在现代桌面应用开发中,系统托盘(System Tray)功能已经成为用户体验的重要组成部分。特别是对于需要长时间运行的应用程序,如即时通讯工具、音乐播放器、系统监控工具等,最小化到系统托盘不仅可以节省任务栏空间,还能让应用在后台持续运行,随时为用户提供服务。

本文以Rouyan这个WPF应用为例,说明在WPF中如何实现最小化到系统托盘。

选择

在WPF中实现系统托盘功能,开发者通常有以下几种选择:

1、System.Windows.Forms.NotifyIcon:最传统的方式,需要引用WinForms

2、Hardcodet.NotifyIcon.Wpf:专为WPF设计的托盘组件

3、H.NotifyIcon.Wpf:Hardcodet的现代维护版本

这里我选择的是H.NotifyIcon.Wpf,选择H.NotifyIcon.Wpf的优势:

1、现代化维护:相比原版Hardcodet,H.NotifyIcon.Wpf有更活跃的维护和bug修复

2、完全兼容:保留了原版的API和XAML命名空间,迁移成本为零

3、WPF原生:无需引入WinForms依赖,与WPF的数据绑定和样式系统完美集成

4、功能丰富:支持气泡提示、上下文菜单、多种鼠标事件等

H.NotifyIcon.Wpf项目地址:https://github.com/HavenDV/H.NotifyIcon

使用

先描述一下,我们想要实现的效果,我想要点击最小化与关闭的时候,让这个应用最小化到系统托盘,然后点击系统托盘的图标显示这个应用,或者右键系统托盘的图标,有两个选项,一个是显示窗口,一个是退出,点击退出才真的退出程序。

第一步安装nuget包:

第二步在主窗口中添加控件:

先添加xmlns:tb="http://www.hardcodet.net/taskbar"与StateChanged="Window_StateChanged"。

<!-- 系统托盘图标 -->

<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是你鼠标悬浮在图标那会出现的文字,TrayLeftMouseDown是鼠标左键点击系统托盘图标事件,ContextMenu是右键系统托盘图标会出现的选项。

现在在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;

}

}

鼠标左键点击系统托盘图标:

private void TrayIcon_TrayLeftMouseDown(object sender, RoutedEventArgs e)

{

ShowMainWindow();

}

private void ShowMainWindow()

{

Show();

WindowState = WindowState.Normal;

Activate();

TrayIcon.Visibility = Visibility.Collapsed;

}

鼠标右键系统托盘出现的显示窗口与退出的事件处理程序:

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

最终效果:

这样就成功实现了在WPF应用中实现最小化到系统托盘,希望对你有所帮助。

http://www.cnnetsun.cn/news/116908.html

相关文章:

  • GraphRAG-Local-UI终极指南:本地知识图谱构建与智能查询完整教程
  • Messari:Flow 生态 2025 年 Q3 发展概览
  • Draft.js工具栏深度定制:构建企业级富文本编辑器的完整实践
  • 下一个版本EmotiVoice将带来哪些惊喜?
  • 明诺多功能全自动洗地机,适用于超市、地库及商场清洁需求
  • 最近网上爆火的Flowith AI是啥?能否成为下一代AI Agent产品?
  • CesiumJS体素渲染终极指南:3D体积数据可视化完整解析
  • LrcApi终极指南:快速构建专业级歌词同步服务的完整方案
  • DeepSeek-V3.2-Exp推理部署终极指南:从模型文件到生产服务的完整路径
  • CVAT用户权限配置完整教程:从基础到高级的团队协作管理终极指南
  • ADC调试踩坑:一个printf引发的“血案“
  • 关键词:一致性算法;直流微电网;下垂控制;分布式二次控制;电压电流恢复与均分;非线性负载
  • ComfyUI-Manager安全权限终极指南:快速解决权限问题
  • Electronic WeChat个性化配置完全指南:从入门到精通
  • I2C总线:时序结构与数据帧
  • 适合新手的电脑版AI编曲软件快速根据哼唱清唱主旋律作伴奏
  • ZW3D二次开发_分享一个通过命令按钮查找关联API函数的插件
  • 【光照】Unity[光照探针]的作用与工作原理
  • 你有没有想过,像 ChatGPT 这样聪明的 AI,它是怎么“出生”的?
  • 基于单片机的数字电压表设计
  • 强化学习系统性学习笔记(二):策略优化的理论基础与算法实现
  • 基于STM32银行医院柜台叫号排队系统语音播报设计
  • c#造个轮子--GIF录制工具
  • 专利申请怕驳回、分类难?别担心!星河智源申请前评估来帮你
  • 【EF Core】通过 DbContext 选项扩展框架
  • 新用户免费试用EmotiVoice 1000个token
  • 免费视频增强神器:3步将模糊视频升级4K超清画质
  • dp 总结 1
  • 5大核心参数精准调优:从理论到实践的Faiss HNSW索引优化指南
  • LeetCode 最小覆盖子串:滑动窗口 + 哈希表高效解法