WPF实现基础控件之托盘的示例代码

下面是WPF实现托盘的完整攻略:

一、前期准备

在开始编写代码之前,首先需要在项目中添加两个NuGet包:

这两个包的添加方式可以通过NuGet包管理器或在项目文件中手动添加。

二、定义托盘图标和菜单

在主窗口中添加托盘图标,并在托盘图标的上下文菜单中添加菜单项,可以通过以下代码实现:

<Window ...>
    ...
    <Window.Resources>
        <tray:TaskbarIcon x:Key="NotifyIcon" IconSource="icon.ico">
            <tray:TaskbarIcon.ContextMenu>
                <ContextMenu>
                    <MenuItem Header="打开窗口" Command="{Binding OpenWindowCommand}" />
                    <Separator />
                    <MenuItem Header="退出" Command="{Binding ExitCommand}" />
                </ContextMenu>
            </tray:TaskbarIcon.ContextMenu>
        </tray:TaskbarIcon>
    </Window.Resources>
    ...
</Window>

上述代码中,tray是指向Hardcodet.NotifyIcon.Wpf命名空间的XAML命名空间,icon.ico是托盘图标的路径。同时,在托盘图标的上下文菜单中定义了两个菜单项,分别绑定到主窗口ViewModel中的OpenWindowCommandExitCommand命令。

三、实现托盘功能

在主窗口ViewModel中,实现托盘功能需要完成以下几个步骤:

  1. 定义一个NotifyIcon对象,并在视图中绑定到托盘图标。
public class MainViewModel : INotifyPropertyChanged
{
    ...
    private readonly NotifyIcon _notifyIcon;

    public MainViewModel()
    {
        _notifyIcon = (NotifyIcon)Application.Current.FindResource("NotifyIcon");
        ...
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void OnPropertyChanged([CallerMemberName] string propertyName = "")
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
    ...
}

在ViewModel的构造函数中获取在视图中定义的NotifyIcon对象,并保存到一个私有字段,以便后续使用。

  1. 定义OpenWindowCommand和ExitCommand命令,并实现相应的功能。
public class MainViewModel : INotifyPropertyChanged
{
    ...
    public ICommand OpenWindowCommand => new DelegateCommand(() =>
    {
        // 显示或激活主窗口
        var mainWindow = Application.Current.Windows.OfType<MainWindow>().FirstOrDefault();
        if (mainWindow != null)
        {
            mainWindow.Show();
            if (mainWindow.WindowState == WindowState.Minimized)
            {
                mainWindow.WindowState = WindowState.Normal;
            }
            mainWindow.Activate();
        }
    });

    public ICommand ExitCommand => new DelegateCommand(() =>
    {
        // 关闭应用程序
        Application.Current.Shutdown();
    });
    ...
}

上述代码中,OpenWindowCommand命令用于打开或激活主窗口,ExitCommand命令用于退出应用程序。

  1. 添加对WindowState的监听,实现窗口最小化时隐藏窗口并显示托盘图标。
public class MainViewModel : INotifyPropertyChanged
{
    ...
    public MainViewModel()
    {
        _notifyIcon = (NotifyIcon)Application.Current.FindResource("NotifyIcon");
        ...
        // 添加对WindowState的监听
        var mainWindow = Application.Current.Windows.OfType<MainWindow>().FirstOrDefault();
        if (mainWindow != null)
        {
            mainWindow.StateChanged += (sender, e) =>
            {
                switch (mainWindow.WindowState)
                {
                    case WindowState.Minimized:
                        mainWindow.Hide();
                        _notifyIcon.ShowBalloonTip("提示", "应用程序已最小化到托盘", BalloonIcon.Info);
                        break;
                    case WindowState.Normal:
                        _notifyIcon.HideBalloonTip();
                        break;
                }
            };
        }
    }
    ...
}

在构造函数中获取主窗口对象,并添加对WindowState的监听。当窗口状态变为最小化时,隐藏窗口并显示一个气泡提示,提醒用户应用程序已经最小化到托盘。

  1. 实现托盘图标的交互行为,如右键菜单打开主窗口。
public class MainViewModel : INotifyPropertyChanged
{
    ...
    public MainViewModel()
    {
        ...
        // 实现交互行为
        Interaction.GetBehaviors(_notifyIcon).Add(new TaskbarIconBehavior(OpenWindowCommand));
    }
    ...
}

public class TaskbarIconBehavior : Behavior<NotifyIcon>
{
    private readonly ICommand _command;

    public TaskbarIconBehavior(ICommand command)
    {
        _command = command;
    }

    protected override void OnAttached()
    {
        base.OnAttached();
        AssociatedObject.TrayMouseDoubleClick += AssociatedObjectOnTrayMouseDoubleClick;
    }

    protected override void OnDetaching()
    {
        base.OnDetaching();
        AssociatedObject.TrayMouseDoubleClick -= AssociatedObjectOnTrayMouseDoubleClick;
    }

    private void AssociatedObjectOnTrayMouseDoubleClick(object sender, RoutedEventArgs e)
    {
        _command.Execute(null);
    }
}

在主窗口ViewModel中,通过Behavior将托盘图标的交互行为定义为一个类,该类实现OnAttachedOnDetaching等相关方法,将双击图标打开主窗口的逻辑绑定到OpenWindowCommand命令上。

至此,WPF实现托盘的工作完毕。

四、示例说明

  1. 如何使用NotifyIcon显示气泡提示?

可以通过ShowBalloonTip方法显示气泡提示,方法参数包括提示标题、提示消息和提示图标。例如:

_notifyIcon.ShowBalloonTip("提示", "这是一条气泡提示", BalloonIcon.Info);
  1. 如何在托盘图标上添加自定义图标?

可以通过在托盘图标的XAML中指定IconSource属性实现自定义图标。例如:

<tray:TaskbarIcon IconSource="my_icon.ico">

其中my_icon.ico是自定义图标的文件名。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:WPF实现基础控件之托盘的示例代码 - Python技术站

(1)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • 浅谈在eclipse中如何修改svn的用户名和密码

    修改svn的用户名和密码在eclipse中可以通过以下步骤完成: 打开菜单Window -> Show View -> Other,打开SVN Repository Exploring视图 在SVN Repository Exploring视图中,单击右键,选择“New -> Repository Location”添加一个新的SVN仓库位…

    other 2023年6月27日
    00
  • 如何在Android Studio下进行NDK开发

    下面是详细的“如何在Android Studio下进行NDK开发”的完整攻略: 一、什么是NDK? NDK(Native Development Kit)是一个适用于Android平台的开发工具包,可以让开发者使用C或C++等高级语言编写可与Java代码或已经存在的库进行交互的本地库。NDK是如何与其他组件进行交互的主要方式是使用JNI(Java Nativ…

    other 2023年6月26日
    00
  • nagios服务端配置及客户的安装配置步骤分享[图文]

    下面是详细讲解“nagios服务端配置及客户的安装配置步骤分享[图文]”的完整攻略。 Nagios服务端配置及客户的安装配置步骤分享 1. 安装Nagios服务端 使用以下命令下载Nagios源代码: wget https://assets.nagios.com/downloads/nagioscore/releases/nagios-4.4.6.tar.g…

    other 2023年6月27日
    00
  • html5编辑工具

    当然,我很乐意为您提供关于HTML5编辑工具的完整攻略。以下是详细的步骤说明: 步骤说明 HTML5编辑工具是一种用于创建和HTML5网页的工具。以下是使用HTML5编辑工的详细步骤: 1.选择一个HTML5编辑工具。目前市面上有很多HTML5编辑工具可供选择,例如Adobe Dreamaver、Sublime Text、Atom等。可以根据自己的需求和偏好…

    other 2023年5月9日
    00
  • Android源码 在Ubuntu上下载,编译和安装

    Android源码 在Ubuntu上下载、编译和安装攻略 本攻略将详细介绍如何在Ubuntu操作系统上下载、编译和安装Android源码。以下是完整的步骤: 步骤1:准备工作 在开始之前,请确保您已经满足以下要求: 一台运行Ubuntu操作系统的计算机。 至少100GB的可用磁盘空间。 至少8GB的RAM。 快速的互联网连接。 步骤2:安装必要的软件包 在终…

    other 2023年8月15日
    00
  • Java处理表格的实用工具库

    Java处理表格的实用工具库 在Java开发中,有许多实用的工具库可用于处理表格数据。以下是使用两个常用的Java表格处理工具库的详细攻略: Apache POI Apache POI是一个流行的Java库,用于读取、写入和操作Microsoft Office格式的文件,包括Excel表格。以下是使用Apache POI处理表格的示例说明: 首先,确保已经添…

    other 2023年10月15日
    00
  • 小爱同学怎么自定义唤醒词 小爱同学自定义唤醒词教程

    小爱同学怎么自定义唤醒词 1. 概述 小爱同学是小米公司推出的人工智能语音交互产品,用户可以通过唤醒“小爱同学”来与其进行语音交互。默认的唤醒词是“小爱同学”,但是用户可以自定义唤醒词。 2. 自定义唤醒词的步骤 2.1 修改设备名称 首先,需要将设备名称修改为新的唤醒词。具体操作步骤如下: 打开米家APP,在设备列表中找到需要修改的小爱同学设备。 点击设备…

    other 2023年6月25日
    00
  • android Socket实现简单聊天功能以及文件传输

    Android Socket实现简单聊天功能以及文件传输的步骤如下: 1. 创建服务端 首先,需要创建一个服务端,用于接收客户端请求。在服务端创建Socket实例,并指定端口号,即可监听客户端的请求。以下是一个简单的服务端代码示例,用于接受客户端的连接请求并接受消息: public class ServerSocketThread extends Threa…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部