一 基本功能
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 13.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(1000); } } 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 13.ico 要不然会出错,我猜想这里应该是 Icon 13.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.效果