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包的引用。

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

相关推荐
听麟1 小时前
HarmonyOS 6.0+ 跨端智慧政务服务平台开发实战:多端协同办理与电子证照管理落地
笔记·华为·wpf·音视频·harmonyos·政务
听麟5 小时前
HarmonyOS 6.0+ APP AR文旅导览系统开发实战:空间定位与文物交互落地
人工智能·深度学习·华为·ar·wpf·harmonyos
聆风吟º20 小时前
CANN hccl 深度解析:异构计算集群通信库的跨节点通信与资源管控实现逻辑
人工智能·wpf·transformer·cann
无心水1 天前
分布式定时任务与SELECT FOR UPDATE:从致命陷阱到优雅解决方案(实战案例+架构演进)
服务器·人工智能·分布式·后端·spring·架构·wpf
LZL_SQ1 天前
HCCL测试框架中AllReduce边界条件测试设计深度剖析
wpf·cann
User_芊芊君子2 天前
【分布式训练】CANN SHMEM跨设备内存通信库:构建高效多机多卡训练的关键组件
分布式·深度学习·神经网络·wpf
就是有点傻3 天前
WPF按钮走马灯效果
wpf
zuozewei3 天前
虚拟电厂聚合商平台安全技术体系深度解读
安全·wpf
极客智造3 天前
WPF 自定义控件:AutoGrid 实现灵活自动布局的网格控件
wpf
极客智造3 天前
WPF Grid 布局高效扩展:GridHelpers 附加属性工具类全解析
wpf