WPF应用最小化到系统托盘

news/2025/10/9 12:44:21/文章来源:https://www.cnblogs.com/mingupupu/p/19130874

前言

在现代桌面应用开发中,系统托盘(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.mzph.cn/news/932549.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深圳网站优化计划商务网站的建设有哪几个步骤

满意答案 你机器里装了北信源的DeviceRegist软件,这个软件不是杀毒软件或者防毒软件,而是一个远程桌面管理软件。这类软件其实和木马程序原理上一样,只不过是正规软件公司开发的,但是流氓程度不容小觑,即使在安全模式下也会加载vrvrf_c.exe,vrvedp_m.exe,vrvsafec.exe,wat…

大庆 网站建设长沙精品网站制作

主题介绍&#xff1a; 今日在网上寻找wordpress主题的时候逛到了大叔的网站&#xff0c;赶脚这个主题蛮不错的&#xff0c;于是百度一下&#xff0c;果然&#xff0c;这个主题很受欢迎。作为主题下载站追梦者也不甘落后&#xff0c;马上就发布出来了&#xff0c;希望对你们有用…

网站建设公司联系方式北京网站开发周期

很多核心Java面试题来源于多线程(Multi-Threading)和集合框架(Collections Framework)&#xff0c;理解核心线程概念时&#xff0c;娴熟的实际经验是必需的。这篇文章收集了 Java 线程方面一些典型的问题&#xff0c;这些问题经常被高级工程师所问到。 0.Java 中多线程同步是什…

Hyper-v 安装 Android9

选第一代 硬盘后续添加vhd格式的

网站每年多少钱wordpress怎样建立多站点

一 压力测试的目的 评估系统的能力识别系统的弱点&#xff1a;瓶颈/弱点检查系统的隐藏的问题检验系统的稳定性和可靠性 二 性能测试指标以及测算 【虚拟用户数】&#xff1a;线程用户【并发数】&#xff1a;指在某一时间&#xff0c;一定数量的虚拟用户同时对系统的某个功…

河南app手机网站制作合肥有多少建网站公司

欧冠16强抽签揭晓&#xff0c;结果&#xff1a;多特VS巴黎&#xff0c;皇马VS曼城&#xff0c;亚特兰大VS瓦伦西亚&#xff0c;马竞VS利物浦&#xff0c;切尔西VS拜仁&#xff0c;里昂VS尤文图斯&#xff0c;热刺VS莱比锡&#xff0c;那不勒斯VS巴萨。怎么评价这样的抽签呢&…

计算机毕业设计springboot制氢领域文献管理强大的系统 基于SpringBoot的氢能研究文献管理平台 面向制氢技能的文献资料管理系统设计与实现

计算机毕业设计springboot制氢领域文献管理强大的系统 基于SpringBoot的氢能研究文献管理平台 面向制氢技能的文献资料管理系统设计与实现2025-10-09 12:29 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space:…

网站分析报告范文2000产品开发流程管理

var A {a:1,b:2,c:3,d:"hello world"};for(var k in A) {console.log(k,A[k]);var h new EJS({element:ejs_render_id}).render(render);}return;转载于:https://www.cnblogs.com/pansidong/p/8708245.html

数论上

目录数论上前言模运算基本概念基础性质基础运算除法逆元除法的一般情况次幂(欧拉定理)费马小定理&欧拉定理原根与阶对数(BSGS)开根(二次剩余) 数论上 前言 叠甲:本文的许多定义并不是最官方严谨的,但是其实…

数论中

目录数论中前言一些定理欧几里得算法全家桶中国剩余定理及其拓展(CRT)威尔逊定理及逆定理拉格朗日定理(没有用,不需要讲) 数论中 前言 叠甲:本文的许多定义并不是最官方严谨的,但是其实是本质相同的,不过更偏实…

Vue 3 + TypeScript 中 QCarousel 模板引用类型错误解决方案

Vue 3 + TypeScript 中 QCarousel 模板引用类型错误解决方案Vue 3 + TypeScript 中 QCarousel 模板引用类型错误解决方案 一、问题描述 在 Vue 3 + TypeScript 项目中使用 Quasar 的QCarousel组件时,通过$refs.carous…

网站建设心得.doc广告设计好找工作吗

LinkedList 是 Java 中的一个双向链表实现的类&#xff0c;它实现了 List 接口&#xff0c;同时也实现了 Deque 接口&#xff0c;因此可以用作列表、队列或双端队列。下面是关于 LinkedList 的基本介绍和细节讨论&#xff1a; 基本介绍&#xff1a; LinkedList 是一个双向链表…

数论下

目录数论下前言因数与数论函数基础基础概念与定义整数唯一分解定理/算术基本定理素数判定/分解质因数/得到约数数论分块(整除分块)数论函数相关积性函数筛法埃氏筛欧拉筛杜教筛Powerful Number筛Min_25筛洲阁筛莫比乌…

赌狗确实很爽,也确实很容易上天台

正文 一、赌博为什么这么爽?赌博的时候,大脑会释放大量的多巴胺,这种神经递质会让人产生强烈的快感。而且,这种快感不是在赢钱的时候才有,而是在下注的那一刻就开始了。就像你买彩票的时候,在开奖之前,你会幻想…

微信网页宣传网站怎么做免费ai写作网站3000字

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼就下面这个程序 输入其他的数字都可以算出面积 但是当输入3,4,6时 计算出面积为零 求吧友指出错误在哪package javaapplication17;import java.util.Scanner;public class JavaApplication17 {public static void main(String[] ar…

ZYNQ xapp585 lvds 文档阅读 (三)

ZYNQ xapp585 lvds 文档阅读 (三)参考设计:可从 Xilinx 官网下载本应用笔记的参考设计文件,文件同时提供 Verilog 和 VHDL 两种格式。本文中展示的不同方法对应的图中,均包含了相应文件的名称。此外,文件中还包括…

切削工具东莞网站建设wordpress 发布 软件

文章目录 前言LeetCode、1143. 最长公共子序列【中等&#xff0c;二维DP】题目链接与分类思路2022年暑假学习思路及题解二维DP解决 资料获取 前言 博主介绍&#xff1a;✌目前全网粉丝2W&#xff0c;csdn博客专家、Java领域优质创作者&#xff0c;博客之星、阿里云平台优质作者…

html5 图片网站flash网页设计教程

目录 一、相关和回归的概念&#xff08;一&#xff09;变量间的关系&#xff08;二&#xff09;Pearson&#xff08;皮尔逊&#xff09;相关系数 二、线性回归的概念和方程&#xff08;一&#xff09;回归分析概述&#xff08;二&#xff09;线性回归方程 三、线性回归模型的损…

自己做的表白网站栖霞酒店网站设计价格

iostat命令统计的磁盘I/O延迟通常是以毫秒&#xff08;ms&#xff09;为单位&#xff0c;例如在输出中的await字段表示的是平均服务时间&#xff0c;包括等待时间和处理时间&#xff0c;这个值就是以毫秒为单位。 然而&#xff0c;要获取更精确到微秒级别&#xff08;us&#x…