WPF中如何将页面最小化时放入托盘

本文使用MainWindow.xaml和MainWindow.xaml.cs作为示例 来实现这个放入托盘中

1. 安装NuGet包

首先,在你的项目中安装这个库

复制代码
Hardcodet.NotifyIcon.Wpf 这个库

2修改页面中的 XAML 代码

XML 复制代码
<Window x:Class="EquipmentInformation.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:EquipmentInformation"
        xmlns:tb="http://www.hardcodet.net/taskbar"  <!-- 1. 引入命名空间 -->
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800"
        StateChanged="Window_StateChanged">  <!-- 2. 监听窗口状态变化 -->
    <Grid>
        <!-- 你的界面内容保持不变 -->

        <!-- 3. 添加托盘图标控件 -->
        <tb:TaskbarIcon x:Name="TrayIcon"
                        IconSource="/app.ico"  <!-- 图标路径,需添加到项目中 -->
                        ToolTipText="Equipment Information"  <!-- 鼠标悬停文本 -->
                        TrayLeftMouseDown="TrayIcon_TrayLeftMouseDown">  <!-- 左键点击事件 -->
            
            <!-- 右键菜单 -->
            <tb:TaskbarIcon.ContextMenu>
                <ContextMenu>
                    <MenuItem Header="打开主窗口" Click="ShowWindow_Click"/>
                    <Separator/>
                    <MenuItem Header="退出" Click="ExitApp_Click"/>
                </ContextMenu>
            </tb:TaskbarIcon.ContextMenu>
        </tb:TaskbarIcon>
    </Grid>
</Window>

IconSource 改为标准的 WPF Pack URI 语法:

XML 复制代码
<tb:TaskbarIcon x:Name="TrayIcon"
                IconSource="pack://application:,,,/app.ico"
                ToolTipText="Equipment Information">

3. 编写后台代码 (MainWindow.xaml.cs)

XML 复制代码
using System.Windows;

namespace EquipmentInformation
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            // 初始化时,托盘图标默认是隐藏的,等最小化时再显示
            TrayIcon.Visibility = Visibility.Collapsed;
        }

        /// <summary>
        /// 当窗口状态改变时触发(如最小化)
        /// </summary>
        private void Window_StateChanged(object sender, System.EventArgs e)
        {
            if (WindowState == WindowState.Minimized)
            {
                // 1. 隐藏主窗口
                this.Hide();
                // 2. 显示托盘图标
                TrayIcon.Visibility = Visibility.Visible;
                // 3. 可选:显示一个气泡提示,告知用户程序已最小化到托盘
                TrayIcon.ShowBalloonTip("提示", "应用程序已最小化到托盘", BalloonIcon.Info);
            }
        }

        /// <summary>
        /// 鼠标左键点击托盘图标时,恢复显示主窗口
        /// </summary>
        private void TrayIcon_TrayLeftMouseDown(object sender, RoutedEventArgs e)
        {
            ShowMainWindow();
        }

        /// <summary>
        /// 右键菜单"打开主窗口"的点击事件
        /// </summary>
        private void ShowWindow_Click(object sender, RoutedEventArgs e)
        {
            ShowMainWindow();
        }

        /// <summary>
        /// 右键菜单"退出"的点击事件
        /// </summary>
        private void ExitApp_Click(object sender, RoutedEventArgs e)
        {
            // 彻底退出应用程序
            TrayIcon.Dispose(); // 清理托盘图标资源
            Application.Current.Shutdown();
        }

        /// <summary>
        /// 辅助方法:显示窗口并隐藏托盘图标
        /// </summary>
        private void ShowMainWindow()
        {
            this.Show();
            this.WindowState = WindowState.Normal; // 确保窗口是正常状态
            this.Activate(); // 激活窗口,使其置于最前
            TrayIcon.Visibility = Visibility.Collapsed; // 再次隐藏托盘图标
        }

        /// <summary>
        /// 重写OnClosing方法:阻止直接关闭,改为最小化
        /// </summary>
        protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
        {
            // 如果不是通过"退出"菜单关闭的,就取消关闭并最小化
            e.Cancel = true;
            this.WindowState = WindowState.Minimized;
        }
    }
}

效果如下:

相关推荐
雪靡40 分钟前
WPF PerMonitorV2 下的跨窗口问题
c#·wpf
listening7771 天前
HarmonyOS 6.1 分布式文件服务实战:跨设备商品图片/视频秒开方案
wpf·harmonyos
Macbethad1 天前
基于WPF的半导体设备EAP控制程序架构设计与实现
wpf
国服第二切图仔2 天前
HarmonyOS APP《画伴梦工厂》开发第60篇-分布式软总线2.0——多设备协同新范式
分布式·wpf·harmonyos
精神底层2 天前
拒绝 UI 卡死!我用 CSnakes 实时拦截 Python 训练流,在 WPF 中重构了 ScottPlot 5 高性能 AI 看板
python·ui·wpf
爱吃大芒果2 天前
不用多设备模拟器跑通 ShareKit 碰一碰分享
华为·wpf·harmonyos
贪玩的小松鼠3 天前
WPF基础到企业应用系列7——深入剖析依赖属性(WPF/Silverlight核
wpf
界面开发小八哥3 天前
界面控件DevExpress WPF v26.1新版亮点 - TreeView、Spreadsheet控件功能升级
.net·wpf·界面控件·devexpress·ui开发
斯文的八宝粥4 天前
WPF企业内训全程实录(下)
大数据·hadoop·wpf
精明的身影6 天前
深入WPF -- Dispatcher(补)
wpf