一 基本功能

1. 这里是用 NotifyIcon 控件来实现,但 WPF 下没有 NotifyIcon  控件,怎么办,用 WinForm 下的呗。

先引用  .NET 自带的两个程序集
System.Windows.Forms 是用来使用 NotifyIcon 控件的;
System.Drawing 是用来引用图标文件的

2. 图标

3. 设置图标属性

4.这里很重要,因为程序运行后,会在运行程序目录下去找图标文件,这样设置后就会在应用程序目录下生成对应的文件,如果不设置,到时候出错就找不到原因,反正这里我是搞了几个小时才发现这里要这样设置的。

5. 设置窗体的 StateChanged="Window_StateChanged_1" 事件

6.代码

        using System.Windows.Forms;
using System.IO; WindowState ws;
WindowState wsl;
NotifyIcon notifyIcon; public MainWindow()
{
InitializeComponent(); icon(); //保证窗体显示在上方。
wsl = WindowState;
} private void icon()
{
string path = System.IO.Path.GetFullPath(@"Icon\013.ico");
if (File.Exists(path))
{
this.notifyIcon = new NotifyIcon();
this.notifyIcon.BalloonTipText = "Hello, 文件监视器"; //设置程序启动时显示的文本
this.notifyIcon.Text = "文件监视器";//最小化到托盘时,鼠标点击时显示的文本
System.Drawing.Icon icon = new System.Drawing.Icon(path);//程序图标
this.notifyIcon.Icon = icon;
this.notifyIcon.Visible = true;
notifyIcon.MouseDoubleClick += OnNotifyIconDoubleClick;
this.notifyIcon.ShowBalloonTip();
} } private void OnNotifyIconDoubleClick(object sender, EventArgs e)
{
this.Show();
WindowState = wsl;
} private void Window_StateChanged_1(object sender, EventArgs e)
{
ws = this.WindowState;
if (ws == WindowState.Minimized)
{
this.Hide();
}
}

7. 如果您要设置窗体的图标,最好不要设置为 Icon\013.ico 要不然会出错,我猜想这里应该是 Icon\013.ico 这个图标已经被 NotifyIcon 使用或者什么原因。

 
8.效果

二 加入右键菜单
1. 在 WinForm实现窗体最小化后小图标在右边任务栏下  中我是用 ContextMenuStrip 控件来加了,但 WPF 没有这个控件,和上面同样的办法

#region 托盘右键菜单
private void contextMenu()
{
ContextMenuStrip cms = new ContextMenuStrip(); //关联 NotifyIcon 和 ContextMenuStrip
notifyIcon.ContextMenuStrip = cms; System.Windows.Forms.ToolStripMenuItem exitMenuItem = new System.Windows.Forms.ToolStripMenuItem();
exitMenuItem.Text = "退出";
exitMenuItem.Click += new EventHandler(exitMenuItem_Click); System.Windows.Forms.ToolStripMenuItem hideMenumItem = new System.Windows.Forms.ToolStripMenuItem();
hideMenumItem.Text = "隐藏";
hideMenumItem.Click += new EventHandler(hideMenumItem_Click); System.Windows.Forms.ToolStripMenuItem showMenuItem = new System.Windows.Forms.ToolStripMenuItem();
showMenuItem.Text = "显示";
showMenuItem.Click += new EventHandler(showMenuItem_Click); cms.Items.Add(exitMenuItem);
cms.Items.Add(hideMenumItem);
cms.Items.Add(showMenuItem);
} private void exitMenuItem_Click(object sender, EventArgs e)
{
notifyIcon.Visible = false; System.Windows.Application.Current.Shutdown();
} private void hideMenumItem_Click(object sender, EventArgs e)
{
this.Hide();
} private void showMenuItem_Click(object sender, EventArgs e)
{
this.Show();
this.Activate();
}
#endregion

2. 主菜单中加入这句话就可以

        public MainWindow()
{
InitializeComponent(); //NotifyIcon
icon(); //ContextMenuStrip
contextMenu(); //保证窗体显示在上方。
wsl = WindowState; }

3.效果

 

WPF实现窗体最小化后小图标在右边任务栏下的更多相关文章

  1. WinForm实现窗体最小化后小图标在右边任务栏下

    一 基本功能1.  首先新建一个窗体,然后拖入一个名为 NotifyIcon 的控件,名字我没有改,就那个名字 2. 我的应用程序下有些图标文件,这里我用这个图标,我选择 013.ico 3. 选择 ...

  2. c# 窗体最小化后截图实现

    我们知道,当我们需要对Control进行截图时,我们可以使用Control.DrawToBitmap()进行截图, 那么问题来了,当我们的窗体最小化了,我们还怎么截图呢? 当窗体最小化的时候,我们知道 ...

  3. qt widget设置Qt::FramelessWindowHint和Qt::WA_TranslucentBackground, 会出现一个bug: 在最小化后还原时界面停止刷新

    qt widget设置Qt::FramelessWindowHint和Qt::WA_TranslucentBackground, 会出现一个bug: 在最小化后还原时界面停止刷新 Widget wit ...

  4. Delphi: 模态窗体最小化

    源起: 近期所介入的几个项目中,最后视频生成窗体,为一模态对话框.因生成时间可能较长,所以其窗体可以最小化,它最小化时同时最小化主程序,唤醒时主程序再复原. 代码亦是8年前本人所写,一直那样用了,也没 ...

  5. Windows 窗体最小化和隐藏的区别及恢复

    应用程序有托盘图标,窗体最小化或者隐藏窗体时,点击托盘图标需要恢复窗体显示,并且恢复之前的现实状体,正常大小或者最大化显示.例如:最大化显示窗体时,点击最小化按钮,窗体最小化,点击托盘图标将最大化显示 ...

  6. easyui最小化后停留在页面的右下角

    0.此方法没有什么技术含量,纯属于自己瞎想的!如果有的好方法,请留言告之谢谢!! 1.直接上代码: $('#winId').window({ onMinimize: function () { //最 ...

  7. delphi模态窗体最小化会隐藏的问题

    在使用delphi创建模态窗体的时候最小化窗体会导致最小化的窗体不可见,再次点击主窗体才会显示. 在这个模态窗体中增加以下函数 procedure WmSysCommand(var msg: TMes ...

  8. winform最小化后重复进load事件原因

    最近编写一个工具发现的问题,窗体不论是最小化还是进入托盘,重新打开的时候都会进入控件load事件. 产生这个现象的条件是: 1.使用了用户控件,在控件中使用了load事件 2.在主窗体中,隐藏或显示任 ...

  9. wpf 窗口最小化后,触发某事件弹出最小化窗口并置顶

    //如果窗口最小化了弹出并置顶----事件触发调用 ShowWindowAsync(new System.Windows.Interop.WindowInteropHelper(CommonHelpe ...

随机推荐

  1. Javascript中使用replace()方法+正则表达式替换掉所有字符

    Js中的replace方法,只能替换掉第一次匹配到的字符,   而我们经常需要替换一个字符串中所有的匹配字符,这时候可以用正则表达式: str.replace(/a/g,"b"); ...

  2. Android Training: 设备管理

    Android 设备管理 Android2.2 通过Android设备管理API提供对企业级应用的支持.设备管理API在系统级别提供了设备管理特性.这些API可以在企业环境下,需要对员工设备进行控制时 ...

  3. C#如何解决对ListView控件更新以及更新时界面闪烁问题

    第一个问题:如何更新ListView控件内容 很多时候运行窗体程序时,由于程序中使用了多线程加之操作不当,所以在对控件操作时会出现下面这样的异常:   这是因为我们在窗体中添加的控件都有属于自己的线程 ...

  4. mysql设置字体

    如果在linux下重启mysql服务的时候出现Job failed to start,在window下重启失败,这是因为你安装了高版本的mysql(mysql5.5以上),在高版本对字符编码方式修改的 ...

  5. vs2010中出现:程序管理器匹配不正确错误

    http://bbs.csdn.net/topics/360074795 这是一篇csdn上的讨论帖,第15楼给出了正解

  6. entity framework 6 通用数据类

    原文  http://blog.csdn.net/laokaizzz/article/details/25730813 public class BaseDAL { string strConn = ...

  7. 轻松实现HTML5时钟(分享下自己对canvas的理解,原来没你想像的那么难哦)

    Hey,guys! 让我们一起用HTML5实现一下简易时钟吧! 接触canvas时, 我突然有一种非常熟悉的感觉------canvas的部分的功能其实和Photoshop中的 钢笔工具 是一样的.所 ...

  8. 转:Linux中find命令-path -prune用法详解

    在Windows中可以在某些路径中查找文件,也可以设定不在某些路径中查找文件,下面用Linux中的find的命令结合其-path -prune参数来看看在Linux中怎么实现此功能. 假如在当前目录下 ...

  9. python的时间模块

    python有两个重要的时间模块,分别是time和datetime 先看time模块 表示时间的几种方法: 1)时间元组:time.struct_time(tm_year=2016,   tm_mon ...

  10. 解决onethink导出word后出现名字乱码的情况

    这个问题让我纠结了好久最后终于在网上看到一篇文章讲解的还不错 http://www.oschina.net/question/142207_39393