当前位置: 首页 > 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.hskmm.com/?act=detail&tid=27241

相关文章:

  • Hyper-v 安装 Android9
  • test8 - post
  • 素材
  • 数论上
  • 数论中
  • 数论下
  • 赌狗确实很爽,也确实很容易上天台
  • 20252430毛姝涵
  • 在AI技术唾手可得的时代,挖掘开发者工具新需求成为关键突破点
  • uniapp 简单封装接口请求
  • 【SPIE出版】第五届算法、高性能计算与人工智能国际学术会议(AHPCAI 2025)
  • 深入解析:recipes中声明 DEPENDS += “virtual/kernel“ 的效果
  • 2025 防洪板源头厂家最新推荐榜单:铝合金 / 移动 / 应急款精准测评,稳定性能品牌优选指南
  • 完整教程:【复习】计网每日一题--PPP链路
  • Ubuntu安装 IDEA
  • 精密星历内插的MATLAB代码实现
  • .                    当项目规模失控时:架构师的“止损”之道
  • 2025 年护栏厂家最新推荐排行榜:涵盖锌钢防撞桥梁交通市政不锈钢波形围墙道路护栏优质企业锌钢/防撞/桥梁/交通/市政/不锈钢/波形护栏厂家推荐
  • .                                  为什么资深开发者越来越少写代码?
  • .                                  性能优化的尽头,是洞察力
  • 遗传算法的多车场车辆路径问题求解
  • 元数据提供器(IMetadataDetailsProvider)是什么
  • 2025 年清理工具应用程序品牌最新推荐榜单:精选适配 macOS 系统的优质系统优化工具,助力高效管理 icloud 与谷歌云储存空间苹果系统清理/云储存清理工具公司推荐
  • Claude Sonnet 4.5 发布,程序员原地起飞!!
  • 2025 年上海商用净水器公司实力最新推荐权威排行榜:深度剖析学校 / 医院 / 写字楼 / 工厂 / 事业单位优质之选
  • cursor 开了 pro 没办法使用 claude 模型
  • 从0开始使用LabVIEW操作数据采集卡-概述和新建新建项目
  • 当开发者学会拒绝
  • 日志不是垃圾:它是系统的生命线
  • 堆空间的GC和元空间的GC