title author date CreateTime categories
WPF 托盘显示
lindexi
2019-06-23 11:52:36 +0800
2018-11-21 11:19:33 +0800
WPF

本文告诉大家如何在 WPF 实现在托盘显示,同时托盘可以右击打开菜单,双击执行指定的代码

NotifyIcon WPF

通过 Nuget 安装 Hardcodet.NotifyIcon.Wpf 可以快速做到在 WPF 显示托盘

因为托盘是程序的托盘,不是窗口的,所以推荐代码是写在 App.xaml.cs 里面

先创建一个托盘的界面,界面在 App.xaml 创建

托盘是需要图标的,可以从 Iconfont-阿里巴巴矢量图标库 找到好看的图标。在托盘图标需要是 16x16 32位 的 ico 文件

将图片下载放在解决方案,修改为 Resource 就可以

在 App.xaml 定义资源 TaskbarIcon 请看代码

  1. <Application x:Class="HouneaLeabeltezairKayballjachall.App"
  2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4. xmlns:local="clr-namespace:HouneaLeabeltezairKayballjachall"
  5. xmlns:tb="http://www.hardcodet.net/taskbar"
  6. StartupUri="MainWindow.xaml">
  7. <Application.Resources>
  8. <tb:TaskbarIcon x:Key="Taskbar"
  9. IconSource="Taskbar.ico">
  10. </tb:TaskbarIcon>
  11. </Application.Resources>
  12. </Application>

上面代码需要替换 Class="HouneaLeabeltezairKayballjachall.App" 为自己的项目

打开 App.xaml.cs 获取资源,资源只有在获取的时候才会创建,创建了 TaskbarIcon 就会在托盘显示

  1. protected override void OnStartup(StartupEventArgs e)
  2. {
  3. _taskbar = (TaskbarIcon) FindResource("Taskbar");
  4. base.OnStartup(e);
  5. }
  6.  
  7. private TaskbarIcon _taskbar;

运行代码可以看到图片显示图标,下面的图片是我的图标

鼠标移动在托盘上面显示文字,可以在 TaskbarIcon 添加代码

  1. <tb:TaskbarIcon x:Key="Taskbar"
  2. ToolTipText="鼠标移动上显示的文字"
  3. IconSource="Taskbar.ico">
  4.  
  5. </tb:TaskbarIcon>

双击托盘运行代码需要添加命令,创建一个 ViewModel 用来绑定命令

  1. public class DelegateCommand : ICommand
  2. {
  3. public Action CommandAction { get; set; }
  4. public Func<bool> CanExecuteFunc { get; set; }
  5.  
  6. public void Execute(object parameter)
  7. {
  8. CommandAction();
  9. }
  10.  
  11. public bool CanExecute(object parameter)
  12. {
  13. return CanExecuteFunc == null || CanExecuteFunc();
  14. }
  15.  
  16. public event EventHandler CanExecuteChanged
  17. {
  18. add { CommandManager.RequerySuggested += value; }
  19. remove { CommandManager.RequerySuggested -= value; }
  20. }
  21. }

添加一些功能,显示窗口,隐藏窗口

  1. public class NotifyIconViewModel
  2. {
  3. /// <summary>
  4. /// 如果窗口没显示,就显示窗口
  5. /// </summary>
  6. public ICommand ShowWindowCommand
  7. {
  8. get
  9. {
  10. return new DelegateCommand
  11. {
  12. CanExecuteFunc = () => Application.Current.MainWindow == null,
  13. CommandAction = () =>
  14. {
  15. Application.Current.MainWindow = new MainWindow();
  16. Application.Current.MainWindow.Show();
  17. }
  18. };
  19. }
  20. }
  21.  
  22. /// <summary>
  23. /// 隐藏窗口
  24. /// </summary>
  25. public ICommand HideWindowCommand
  26. {
  27. get
  28. {
  29. return new DelegateCommand
  30. {
  31. CommandAction = () => Application.Current.MainWindow.Close(),
  32. CanExecuteFunc = () => Application.Current.MainWindow != null
  33. };
  34. }
  35. }
  36.  
  37. /// <summary>
  38. /// 关闭软件
  39. /// </summary>
  40. public ICommand ExitApplicationCommand
  41. {
  42. get
  43. {
  44. return new DelegateCommand { CommandAction = () => Application.Current.Shutdown() };
  45. }
  46. }
  47. }

在界面绑定代码

  1. <tb:TaskbarIcon x:Key="Taskbar"
  2. ToolTipText="鼠标移动上显示的文字"
  3. DoubleClickCommand="{Binding ShowWindowCommand}"
  4. IconSource="Taskbar.ico">
  5.  
  6. </tb:TaskbarIcon>

这时的 TaskbarIcon 还没有 ViewModel 可以通过下面的方式

  1. <tb:TaskbarIcon x:Key="Taskbar"
  2. ToolTipText="鼠标移动上显示的文字"
  3. DoubleClickCommand="{Binding ShowWindowCommand}"
  4. IconSource="Taskbar.ico">
  5. <tb:TaskbarIcon.DataContext>
  6. <local:NotifyIconViewModel />
  7. </tb:TaskbarIcon.DataContext>
  8. </tb:TaskbarIcon>

现在双击就可以打开 MainWindow 因为默认 MainWindow 是打开的,比较难看到双击打开。在 App.xaml 去掉默认打开 MainWindow 需要找到下面的代码

  1. StartupUri="MainWindow.xaml"

现在尝试不让默认打开 MainWindow 运行软件,可以看到托盘显示图标,双击图标才可以打开界面

如果要右击显示菜单,需要在 App.xaml 添加定义

  1. <ContextMenu x:Shared="false" x:Key="SysTrayMenu">
  2. <MenuItem Header="显示窗口" Command="{Binding ShowWindowCommand}" />
  3. <MenuItem Header="关闭窗口" Command="{Binding HideWindowCommand}" />
  4. <Separator />
  5. <MenuItem Header="退出" Command="{Binding ExitApplicationCommand}" />
  6. </ContextMenu>

在 TaskbarIcon 使用菜单

  1. <tb:TaskbarIcon x:Key="Taskbar"
  2. ContextMenu="{StaticResource SysTrayMenu}"
  3. ToolTipText="鼠标移动上显示的文字"
  4. DoubleClickCommand="{Binding ShowWindowCommand}"
  5. IconSource="Taskbar.ico">
  6. <tb:TaskbarIcon.DataContext>
  7. <local:NotifyIconViewModel />
  8. </tb:TaskbarIcon.DataContext>
  9. </tb:TaskbarIcon>

因为在 ViewModel 已经写好代码,所以现在就可以运行

默认的软件设置是关闭最后一个窗口的时候应用就关闭,通过设置 App.ShutdownMode 可以在调用退出才关闭,打开 App.xaml 添加代码

  1. ShutdownMode="OnExplicitShutdown"

本文的代码

WPF 托盘显示 右击打开菜单,双击打开软件-CSDN下载

下面还有一些高级的使用

定义托盘鼠标移动上去的文字颜色

  1. <tb:TaskbarIcon.TrayToolTip>
  2. 里面可以添加控件
  3. </tb:TaskbarIcon.TrayToolTip>
  1. <tb:TaskbarIcon x:Key="Taskbar"
  2. ContextMenu="{StaticResource SysTrayMenu}"
  3. DoubleClickCommand="{Binding ShowWindowCommand}"
  4. IconSource="Taskbar.ico">
  5. <tb:TaskbarIcon.TrayToolTip>
  6. <Border
  7. Background="White"
  8. BorderBrush="Orange"
  9. BorderThickness="2"
  10. CornerRadius="4"
  11. Opacity="0.8"
  12. Width="160"
  13. Height="40">
  14. <TextBlock
  15. Text="hello world"
  16. HorizontalAlignment="Center"
  17. VerticalAlignment="Center" />
  18. </Border>
  19. </tb:TaskbarIcon.TrayToolTip>
  20. <tb:TaskbarIcon.DataContext>
  21. <local:NotifyIconViewModel />
  22. </tb:TaskbarIcon.DataContext>
  23. </tb:TaskbarIcon>

因为可以添加控件,发挥你的想法,如添加按钮

  1. <tb:TaskbarIcon x:Key="Taskbar"
  2. ContextMenu="{StaticResource SysTrayMenu}"
  3. DoubleClickCommand="{Binding ShowWindowCommand}"
  4. IconSource="Taskbar.ico">
  5. <tb:TaskbarIcon.TrayToolTip>
  6. <Border
  7. Background="White"
  8. BorderBrush="Orange"
  9. BorderThickness="2"
  10. CornerRadius="4"
  11. Opacity="0.8"
  12. Width="160">
  13. <Grid>
  14. <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" Text="可以放文字"></TextBlock>
  15. <Button Margin="10,100,10,10" Content="可以放按钮"></Button>
  16. </Grid>
  17. </Border>
  18. </tb:TaskbarIcon.TrayToolTip>
  19. <tb:TaskbarIcon.DataContext>
  20. <local:NotifyIconViewModel />
  21. </tb:TaskbarIcon.DataContext>
  22. </tb:TaskbarIcon>

显示气泡

通过下面的代码可以显示气泡

  1. Taskbar.ShowBalloonTip("标题", "内容", BalloonIcon.Info);

如果需要自定义气泡,定义一个继承 UIElement 的类,然后传入 TaskbarIcon.ShowCustomBalloon 就可以

如已经定义了 FancyBalloon 气泡,可以通过下面的代码

  1. FancyBalloon balloon = new FancyBalloon();
  2. TaskbarIcon.ShowCustomBalloon(balloon, PopupAnimation.Slide, 4000 /*多少时间就隐藏*/);

代码:NotifyIcon WPF — Bitbucket

2019-6-23-WPF-托盘显示的更多相关文章

  1. WPF 托盘显示

    本文告诉大家如何在 WPF 实现在托盘显示,同时托盘可以右击打开菜单,双击执行指定的代码 NotifyIcon WPF 通过 Nuget 安装 Hardcodet.NotifyIcon.Wpf 可以快 ...

  2. 在WPF中显示动态GIF

    在我们寻求帮助的时候,最不愿意听到的答复是:很抱歉,在当前版本的产品中还没有实现该功能... 在WPF中显示动态的GIF图像时便遇到了这样的问题,WPF中强大的Image控件却不支持动态的GIF(其只 ...

  3. WPF 图片显示中的保留字符问题

    在WPF中显示一张图片,本是一件再简单不过的事情.一张图片,一行XAML代码即可. 但是前段时间遇到了一件奇怪的事: 开发机上运行正常的程序,在某些客户机器上却显示不了图片,而且除了这个问题,其它运行 ...

  4. C# winForm程序开机启动和托盘显示 (转http://blog.csdn.net/xinyue3054/article/details/6599508)

    这段时间一直进行cs项目,故整理下开机自动运行.托盘.显示.隐藏. (1).在窗口上点击关闭按钮或者最小化时将托盘显示: (2).双击托盘图标显示窗口: (3).右键点击托盘图标提供三个菜单选项,“退 ...

  5. C# 开机自启动和最小化托盘显示

    C# 开机自启动和最小化托盘显示 一.      C# 开机自启动 C# 开机自启动,这个功能是大多数服务型软件很常用一个功能,但是这个功能确是不 太好做,花了两天想对策.不过最终呢,结果还是很满意的 ...

  6. Winform设置托盘程序,托盘显示

    1.拖一个NotifyIcon,一个ContextMenuStrip控件到主窗体中 2.设置notifyIcon1,一个contextMenuStrip1(如下图) Icon为托盘图标,Text托盘显 ...

  7. WPF 循环显示列表

    原文:WPF 循环显示列表 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/SANYUNI/article/details/79423707 项目需要 ...

  8. WPF 窗体显示最前端

    原文:WPF 窗体显示最前端 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/jjx0224/article/details/8782845 如何做一 ...

  9. Beta冲刺(2/7)——2019.5.23

    所属课程 软件工程1916|W(福州大学) 作业要求 Beta冲刺(2/7)--2019.5.23 团队名称 待就业六人组 1.团队信息 团队名称:待就业六人组 团队描述:同舟共济扬帆起,乘风破浪万里 ...

  10. WPF 远程显示原图 当前主页面 工具栏 一个Window页面的元素适用一个效果

    http://www.jb51.net/article/98384.htm 1.wpf远程显示原图: Stretch="Fill" + ; 主要是因为那个950和650,据显示位置 ...

随机推荐

  1. shiro框架在springboot项目中的应用

    地址:https://blog.csdn.net/taojin12/article/details/88343990 地址2:https://blog.csdn.net/bicheng4769/art ...

  2. 5G即将到来,你还会购买4G手机吗?

    科技在不断进步,通信技术也是如此,5G网络将于明年下半年开始测试部署,4G手机是否值得更换呢?三星上周发布了Galaxy Note 9智能手机,这也给消费者带来了一个难题:到底是现在花上1000美元将 ...

  3. php array_diff()函数 语法

    php array_diff()函数 语法 作用:比较两个数组的键值,并返回差集.大理石平台价格表 语法:array_diff(array1,array2,array3...) 参数: 参数 描述 a ...

  4. android开发里跳过的坑——GridView使用Glide加载图片不显示

    用grideview显示本地图片列表,用了Glide加载框架,具体调用如下: Glide.with(mContext).load(Uri.fromFile(file)).into(imageView) ...

  5. php二维数组对某一列进行数据组装

    demo示例: $data = array( '0' => array('id' => 10, 'username' => '陈一'), '1' => array('id' = ...

  6. xxxxxxxxxxxxxxxxxxx

    <!DOCTYPE html> <html lang="en"> <head> <meta http-equiv="Conten ...

  7. CDN-template

    ylbtech-CDN: 1.返回顶部   2.返回顶部   3.返回顶部   4.返回顶部   5.返回顶部     6.返回顶部   7.返回顶部   8.返回顶部   9.返回顶部   10.返 ...

  8. 深入理解Redis的持久化机制和原理

    Redis是一种面向“key-value”类型数据的分布式NoSQL数据库系统,具有高性能.持久存储.适应高并发应用场景等优势.它虽然起步较晚,但发展却十分迅速. 近日,Redis的作者在博客中写到, ...

  9. iframe的基础应用

    点击top.html里面的按钮,刷新left.html右边的内容 <a href="left.html?id=11111&k=5&b=4"  target=& ...

  10. 给url添加时间戳,解决浏览器缓存

    //解决浏览器缓存function timestamp(url){ // var getTimestamp=Math.random(); var getTimestamp=new Date().get ...