WPF如何实现应用程序托盘

在WPF中实现应用程序托盘图标和菜单功能通常需要使用System.Windows.Forms.NotifyIcon类,因为WPF本身并没有直接提供这样的控件。为了使用NotifyIcon,你需要添加对System.Windows.Forms的引用。以下是如何实现的步骤:

1. 添加对 System.Windows.Forms 的引用

在你的WPF项目中,你需要添加对System.Windows.Forms的引用。这可以通过项目的"引用"对话框来完成,或者在项目文件中添加以下代码:

xml 复制代码
<Reference Include="System.Windows.Forms" />

2. 在 App.xaml.cs 中创建 NotifyIcon

你需要在应用程序的启动时创建托盘图标,并在应用程序退出时正确地清理资源。

csharp 复制代码
using System;
using System.Windows;
using System.Windows.Forms;
using Application = System.Windows.Application;

namespace YourNamespace
{
    public partial class App : Application
    {
        private NotifyIcon _notifyIcon;
        private bool _isExit;

        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);
            CreateTrayIcon();
        }

        private void CreateTrayIcon()
        {
            _notifyIcon = new NotifyIcon();
            _notifyIcon.DoubleClick += (s, args) => ShowMainWindow();
            _notifyIcon.Icon = new System.Drawing.Icon("YourIconPath.ico");
            _notifyIcon.Visible = true;

            CreateContextMenu();
        }

        private void CreateContextMenu()
        {
            _notifyIcon.ContextMenuStrip = new ContextMenuStrip();
            _notifyIcon.ContextMenuStrip.Items.Add("Open").Click += (s, e) => ShowMainWindow();
            _notifyIcon.ContextMenuStrip.Items.Add("Exit").Click += (s, e) => ExitApplication();
        }

        private void ShowMainWindow()
        {
            if (MainWindow.IsVisible)
            {
                if (MainWindow.WindowState == WindowState.Minimized)
                {
                    MainWindow.WindowState = WindowState.Normal;
                }
                MainWindow.Activate();
            }
            else
            {
                MainWindow.Show();
            }
        }

        private void ExitApplication()
        {
            _isExit = true;
            MainWindow.Close();
            _notifyIcon.Dispose();
            _notifyIcon = null;
        }

        protected override void OnExit(ExitEventArgs e)
        {
            if (!_isExit)
            {
                _notifyIcon.Dispose();
                _notifyIcon = null;
            }

            base.OnExit(e);
        }
    }
}

3. 设置 NotifyIcon 图标和菜单

在上面的代码中,我们设置了托盘图标的图标路径,并且定义了一个方法来创建上下文菜单。上下文菜单有两个选项:"Open"打开应用程序窗口,"Exit"退出应用程序。

4. 处理窗口关闭事件

如果你想在用户尝试关闭窗口时最小化到托盘而不是完全退出应用程序,你需要在你的主窗口的代码后面处理Closing事件。

csharp 复制代码
protected override void OnClosing(CancelEventArgs e)
{
    if (!_isExit)
    {
        e.Cancel = true;
        Hide(); // 隐藏主窗口
        // 可选:显示一条通知消息
        _notifyIcon.ShowBalloonTip(1000, "Application", "Application has been minimized to tray.", ToolTipIcon.Info);
    }
    base.OnClosing(e);
}

请确保你的应用程序有一个有效的图标文件,并且图标路径是正确的。此外,如果你的应用程序是.NET Core或.NET 5+项目,你还需要确保System.Windows.Forms的兼容性,并可能需要添加对Microsoft.Windows.Compatibility包的引用。

以上步骤将在应用程序中创建一个系统托盘图标,并且当用户尝试关闭窗口时,应用程序将最小化到系统托盘而不是完全退出。

相关推荐
白露与泡影21 小时前
Spring Cloud进阶--分布式权限校验OAuth2
分布式·spring cloud·wpf
枫叶丹41 天前
【HarmonyOS 6.0】ArkData 分布式数据对象新特性:资产传输进度监听与接续传输能力深度解析
开发语言·分布式·华为·wpf·harmonyos
一念春风1 天前
智能文字识别工具(AI)
开发语言·c#·wpf
故事不长丨1 天前
WPF MvvmLight 超详细使用教程
c#·wpf·mvvm·mvvmlight
IT小哥哥呀3 天前
基于windows的个人/团队的时间管理工具
windows·c#·wpf·时间管理
sczmzx3 天前
Cefsharp.WPF高分辨率下崩溃问题解决方案
wpf
cjp5604 天前
023.WPF combox控件数据绑定
wpf
Scout-leaf4 天前
WPF新手村教程(七)—— 终章(MVVM架构初见杀)
c#·wpf
极客智造4 天前
WPF DataGrid 多选绑定 + 强类型命令回调 通用解决方案
wpf
ZoeJoy84 天前
机器视觉C# 调用相机:从 USB 摄像头到海康工业相机(WinForms & WPF)
数码相机·c#·wpf