窗口最小化到托盘

使用notifyIcon控件和contextMenuStrip控件实现

1.将notifyIcon控件和contextMenuStrip控件拖到form上

2.在FORM的FormClosing事件

复制代码
// 取消关闭窗体
e.Cancel = true;

// 将窗体变为最小化
this.WindowState = FormWindowState.Minimized;
this.ShowInTaskbar = false; //不显示在系统任务栏 
notifyIcon1.Visible = true; //托盘图标可见 
notifyIcon1.ShowBalloonTip(10);//显示气泡
复制代码

3.在notifyIcon1的MouseDoubleClick事件

复制代码
 // 如果窗体最小化,则还原
if (this.WindowState == FormWindowState.Minimized)
{
       this.Show();
       this.WindowState = FormWindowState.Normal;
       this.ShowInTaskbar = true;
 }
复制代码

4.在notifyIcon1的ContextMenuStrip属性 指定contextMenuStrip1控件

同时注意要指定icon,否则缩小后看不到

 

5.contextMenuStrip1的item按钮,实现退出功能

 //退出
 this.Close();
 Application.Exit();

6.notifyIcon的ShowBalloonTip属性,显示气泡

 7.指定notifyIcon的图标尺寸

方法一:

NotifyIcon.Icon=newIcon("c:\\你的icon.ico",16,16);

方法二:

直接改designer.cs中的自动代码为this.notIco.Icon = new System.Drawing.Icon(Resrc.C, 16, 16);

Resrc是资源文件

<think>好的,用户想在WPF应用程序中实现窗口最小化到系统托盘的功能。我需要先回忆一下WPF中相关的组件和方法。 首先,WPF本身没有内置的系统托盘控件,但可以使用WinForms的NotifyIcon来实现。不过,可能需要引用System.Windows.Forms库。或者,也可以使用第三方库,但原生方法可能更可靠。 记得用户提到过MFC中的一些做法,比如修改窗口样式和隐藏窗口。在WPF中,可能需要处理窗口的状态变化事件,比如当窗口最小化时隐藏它,并显示托盘图标。 需要处理Window的StateChanged事件,当窗口状态变为Minimized时,隐藏窗口,并创建NotifyIcon。同时,托盘图标需要右键菜单,比如退出选项。还要注意在关闭窗口时释放资源,避免托盘图标残留。 另外,可能需要设置窗口的属性,比如ShowInTaskbar为False,当隐藏窗口时,避免任务栏上仍然显示。同时,双击托盘图标应该恢复窗口。 需要检查是否需要引入Windows Forms的互操作性,添加对System.Windows.Forms的引用,并确保线程问题处理得当,因为WPF和WinForms的组件可能需要在同一线程操作。 然后,代码的大致步骤是:添加必要的引用和命名空间,在XAML中定义窗口的事件处理,或者在代码后台中绑定StateChanged事件。创建NotifyIcon实例,设置图标和文本,添加双击事件来恢复窗口。在窗口关闭时,释放NotifyIcon。 还要考虑用户可能忘记引用System.Drawing,因为图标可能需要从那里加载。或者使用WPF的资源方式加载图标。 最后,测试一下功能是否正常,比如最小化窗口时是否隐藏并显示托盘图标,双击是否恢复,右键菜单能否退出程序,以及程序退出时托盘图标是否消失。 可能还需要处理其他边缘情况,比如窗口最小化状态被其他方式恢复的情况,确保逻辑正确。</think>在 WPF 中实现窗口最小化到系统托盘的功能,可以通过以下步骤完成: ### 实现步骤 1. **添加必要引用** 在项目中右键引用 » 添加引用 » 搜索并添加: - `System.Windows.Forms` - `System.Drawing` 2. **创建托盘图标控件** ```csharp private System.Windows.Forms.NotifyIcon notifyIcon; public MainWindow() { InitializeComponent(); // 初始化托盘图标 notifyIcon = new System.Windows.Forms.NotifyIcon(); notifyIcon.Icon = new System.Drawing.Icon("app.ico"); // 图标路径 notifyIcon.Visible = true; notifyIcon.DoubleClick += (s, e) => ShowWindow(); } ``` 3. **处理窗口状态变化** ```csharp protected override void OnStateChanged(EventArgs e) { if (WindowState == WindowState.Minimized) { this.Hide(); notifyIcon.Visible = true; } base.OnStateChanged(e); } private void ShowWindow() { this.Show(); this.WindowState = WindowState.Normal; notifyIcon.Visible = false; } ``` 4. **添加上下文菜单** ```csharp private void CreateContextMenu() { notifyIcon.ContextMenu = new System.Windows.Forms.ContextMenu(); var menuItem = new System.Windows.Forms.MenuItem("退出"); menuItem.Click += (s, e) => Application.Current.Shutdown(); notifyIcon.ContextMenu.MenuItems.Add(menuItem); } ``` 5. **窗口关闭处理** ```csharp protected override void OnClosed(EventArgs e) { notifyIcon.Dispose(); base.OnClosed(e); } ``` ### 关键特性说明 - 通过`ModifyStyleEx`实现任务栏隐藏的方法在WPF中不再适用,改用`ShowInTaskbar`属性控制 - 需要特别注意跨线程操作问题,所有托盘操作必须在主线程执行 - 建议使用`Hardcodet.Wpf.TaskbarNotification`第三方库简化实现[^2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值