我想快速给WPF程序添加托盘菜单

我想...

1 简单要求:

  • 使用开源控件库

  • 在XAML中声明托盘菜单,就像给控件添加ContextMenu一样

  • 封装了常用命令,比如:打开主窗体、退出应用程序等

TerminalMACS

我在TerminalMACS中添加了托盘菜单,最终实现的托盘菜单效果:

TerminalMACS中实现的托盘菜单
完整效果

2 如何做?

【Step 1】在已创建的WPF项目中,添加HandyControl库,并安装:

Nuget中搜索HandyControl

你问我为什么要使用HC控件库?先看Demo效果:

常规菜单
图形化菜单
闪烁的托盘菜单图标

常用的托盘效果应该都能满足了吧?而实现这些效果,我们自己要码的代码真的不多,因为HC已经封装了,我们直接使用即可。

【Step 2】在窗体中添加HandyControl命名空间

xmlns:hc="https://handyorg.github.io/handycontrol"

【Step 3】声明托盘菜单关键的19行代码

<hc:NotifyIcon x:Name="NotifyIconContextContent" Text="{markup:I18n {x:Static i18NResources:Language.AppTitle}}"Visibility="Visible"Icon="/Images/logo.ico"><hc:NotifyIcon.ContextMenu><ContextMenu><MenuItem Command="hc:ControlCommands.PushMainWindow2Top" Header="{markup:I18n {x:Static i18NResources:Language.PushMainWindow2Top}}"/><MenuItem Command="hc:ControlCommands.ShutdownApp" Header="{markup:I18n {x:Static i18NResources:Language.Exit}}"/></ContextMenu></hc:NotifyIcon.ContextMenu><hc:Interaction.Triggers><hc:EventTrigger EventName="Click"><hc:EventToCommand Command="hc:ControlCommands.PushMainWindow2Top"/></hc:EventTrigger></hc:Interaction.Triggers></hc:NotifyIcon>

上面的代码,一个托盘菜单基本上算完事了,简单说一下:

  • NotifyIcon为托盘菜单控件,Text显示托盘菜单名称,将鼠标放在托盘图标上,ToolTip显示该字符串,一般显示应用程序名称,如下图:

托盘菜单显示应用名称
  • hc:NotifyIcon.ContextMenu 用于声明菜单项,本项目目前加了打开主窗体、退出应用程序两个菜单,而这两个菜单对应的命令HC已经封装,方便使用。

  • 另外,单击托盘菜单,也可弹出应用程序主窗口

【Step 4】手动关闭主窗体时,隐藏而不退出

添加了托盘菜单后,在关闭主窗体时,应该重写OnClosing事件,隐藏主窗体,而不是直接关闭它。

protected override void OnClosing(CancelEventArgs e){    this.Hide();    e.Cancel = true;}

3 更多参考

更多Demo源码请参考 HandyControl[1]

本文源码TerminalMACS[2]

[1]

HandyControl托盘菜单: https://github.com/HandyOrg/HandyControl/blob/master/src/Shared/HandyControlDemo_Shared/UserControl/Controls/NotifyIconDemoCtl.xaml

[2]

TerminalMACS WPF管理端: https://github.com/dotnet9/TerminalMACS/blob/master/src/TerminalMACS.Manager/TerminalMACS.ManagerForWPF/TerminalMACS/Views/MainWindow.xaml

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/310346.shtml

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

相关文章

【半译】在ASP.NET Core中创建内部使用作用域服务的Quartz.NET宿主服务

在我的上一篇文章《在ASP.NET Core中创建基于Quartz.NET托管服务轻松实现作业调度》&#xff0c;我展示了如何使用ASP.NET Core创建Quartz.NET托管服务并使用它来按计划运行后台任务。不幸的是&#xff0c;由于Quartz.NET API的工作方式&#xff0c;在Quartz作业中使用Scoped依…

mysql技术分享-- 视图是什么

视图 最近遇到mysql锁相关问题&#xff0c;在查阅资料时候&#xff0c;经常能看到在锁的解释中总有视图的概念出现&#xff0c;因此我觉得有必要先去了解一下视图相关的详细信息&#xff0c;有助于我对mysql锁相关的理解。视图&#xff08;View&#xff09;是一个命名的虚拟表…

在 Visual Studio 2019 中为 .NET Core WinForm App 启用窗体设计器

当我们在使用 Visual Studio 2019 非预览版本开发 Windows Forms App (.NET Core) 应用程序时是不能使用窗体设计器的。即使在窗体文件上右击选择“显示设计器”菜单&#xff0c;仍旧只能看到代码&#xff0c;无法打开窗体设计器。根据微软开发者博客的描述&#xff0c;我们可以…

mysql技术分享--表分区实现

分区表 分区概念 分区功能并不是在存储引擎层完成的&#xff0c;因此不止有InnoDB存储引擎支持分区&#xff0c;常见的存储引擎MyISAM&#xff0c;NDB等都支持。但是也并不是所有存储引擎都支持&#xff0c;比如CSV&#xff0c;FEDERATED&#xff0c;MERGE等就不支持&#xf…

视频号,张小龙的星辰大海

阅读本文大概需要 4.1分钟。前段时间&#xff0c;微信开通了视频号。本想第一时间写一篇文章&#xff0c;分析下视频号。发现理解还不深入&#xff0c;于是这段时间一直在思考视频号对微信的战略意义和它的前景。思考了接近1个月&#xff0c;想明白了一些事情&#xff0c;有时候…

[Java基础]List集合子类特点

ArrayList练习: package test19;import java.util.ArrayList; import java.util.Iterator;public class ArrayListDemo {public static void main(String[] args){ArrayList<String> array new ArrayList<String>();array.add("hello");array.add(&quo…

[半翻] 设计面向DDD的微服务

这篇文章行文结构对照微软博客&#xff0c; 结合本人意译和多年实践的回顾性思考形成此次读书笔记。Domian-driven Design领域-驱动-设计&#xff08;DDD&#xff09;提倡基于(用例相关的现实业务)进行建模。1. DDD的视角DDD将现实问题视为领域;DDD将独立的问题描述为有界限的上…

【值得收藏】首次披露Facebook移动端软件的持续部署 | IDCF

&#xff08;图片来源于网络&#xff09;摘要持续部署是指软件更新一旦准备好就立即发布的实践方法&#xff0c;在业界越来越多地被采用。移动端软件的更新频率普遍落后于基于云端的服务&#xff0c;原因有很多。比如&#xff0c;移动端软件只能定期发布版本&#xff1b;用户可…

数据结构与算法--二叉树的深度问题

二叉树的深度 题目&#xff1a;输入一颗二叉树的根&#xff0c;求该树的深度。从根节点到叶子节点一次进过的节点形成的一条路径&#xff0c;最长的路径的长度为树的深度。如下图中二叉树的额深度4&#xff0c;因为从根节点A到叶子节点的路径中有4个节点A B E J 问题中定义了一…

进击谷歌:多线程下程序执行顺序怎么稳定不乱?

点击上方蓝字 关注我们面试官您好&#xff0c;我是来面试的您好&#xff0c;我是这次的面试官&#xff0c;先介绍一下自己把我是女孩&#xff0c;blala ....那问一个多线程的问题吧&#xff0c;在一个多线程的环境中&#xff0c;怎么能保证一系列方法的执行顺序呢&#xff1f;…

[Java基础]Set集合概述和特点

练习代码如下: package test21;import java.util.HashSet; import java.util.Set;public class SetDemo {public static void main(String[] args){Set<String> set new HashSet<String>();set.add("hello");set.add("world");set.add("…

深圳本次核酸检普筛怎么将个人信息和结果对应上??

前言 最近深圳疫情比较严重&#xff0c;好在上午新闻公布本次普筛都是阴性&#xff0c;期间我检查了三次&#xff0c;基本上每周测一次的样子&#xff0c;基本的检测非常快&#xff0c;只是需要筛查的人数太多&#xff0c;因此才有几公里的排队出现&#xff0c;期间也发现了一…

借助Redis完成延时任务

背景 相信我们或多或少的会遇到类似下面这样的需求&#xff1a;第三方给了一批数据给我们处理&#xff0c;我们处理好之后就通知他们处理结果。大概就是下面这个图说的。本来在处理完数据之后&#xff0c;我们就会马上把处理结果返回给对方&#xff0c;但是对方要求我们处理速度…

[Java基础]HashSet集合概述和特点

HashSet集合概述和特点: 练习代码如下: package HashSetPackage;import java.util.HashSet;public class HashSetDemo {public static void main(String[] args){HashSet<String> hs new HashSet<String>();hs.add("hello");hs.add("world")…

多亏我缓存技术过硬!疫情防控项目上线,我只用了5天!

先介绍下背景&#xff0c;我是武汉某O2O电商公司开发组长&#xff0c;疫情震中的我被老板要求7天之内上线《疫情防控热点图》项目&#xff0c;几个组员回老家断网&#xff0c;最终就2个人完成开发上线&#xff0c;满足了10w用户的高频访问。时间和人力都紧张&#xff0c;不能按…

数据结构与算法--有序数组中找出和为s的两个数字

有序数组中找和为s的两个数字 题目&#xff1a;输入一个递增排序的数组array&#xff0c; 和一个数字s&#xff0c; 在数组中找出两个数&#xff0c;使得这两个数的和是s&#xff0c;如果有多对&#xff0c;输出一对即可。 最简单方案 双循环&#xff0c;每次获取一个数据&a…