WPF 如何添加系统托盘

1.使用Nuget 添加 handycontrol

cs xmlns:hc="https://handyorg.github.io/handycontrol"

2.窗体添加控件
cs <hc:NotifyIcon x:Name="NotifyIconContextContent" Text="软件名称" ContextMenu="{StaticResource ContextMenu}" Click="NotifyIconContextContent_Click"> </hc:NotifyIcon>

3.最小化隐藏窗体
cs private void btnMinimize_Click(object sender, RoutedEventArgs e) { WindowState = WindowState.Minimized; ShowInTaskbar = false; }

4.单机托盘显示窗体

cs 复制代码
 if (!IsVisible)
 {
     Show();
 }

 if (WindowState == WindowState.Minimized)
 {
     WindowState = WindowState.Normal;
 }

 Activate();
 Topmost = true;  // important
 Topmost = false; // important
 Focus();         // important

示例

  • xaml
cs 复制代码
<Window x:Class="NBApi.Configurator.Views.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:prism="http://prismlibrary.com/"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:b="http://schemas.microsoft.com/xaml/behaviors"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:hc="https://handyorg.github.io/handycontrol"
        mc:Ignorable="d"
        Title="NBAPI4PO Configurator" Height="720" Width="870"
        prism:ViewModelLocator.AutoWireViewModel="True"
        WindowStartupLocation="CenterScreen" WindowStyle="None"
        Background="Transparent" AllowsTransparency="True"
        ResizeMode="NoResize" WindowState="Normal" >
    <b:Interaction.Triggers>
        <b:EventTrigger EventName="Loaded">
            <b:InvokeCommandAction Command="{Binding LoadedWindowCommand}"/>
        </b:EventTrigger>
    </b:Interaction.Triggers>
    <Window.Resources>
        <ContextMenu x:Key="ContextMenu">

            <MenuItem Click="MenuItem_Click"  Header="开机自启"/>
            <Separator></Separator>
            <MenuItem Click="MenuItem_Click_1"  Header="最小化到托盘" />

            <MenuItem Click="MenuItem_Click_2"  Header="退出软件"/>

        </ContextMenu>
    </Window.Resources>
    <Border CornerRadius="8" Background="{DynamicResource PrimaryBackgroundColor}" BorderThickness="1" BorderBrush="#D8D8D8">
        <Grid>
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition Height="78"/>
                    <RowDefinition/>
                    <RowDefinition Height="60"/>
                </Grid.RowDefinitions>
                <Border Grid.Row="0"  
                        BorderThickness="0 0 0 8" BorderBrush="#4DC253" />
                <hc:NotifyIcon x:Name="NotifyIconContextContent"  Text="软件名称"
                ContextMenu="{StaticResource ContextMenu}" Click="NotifyIconContextContent_Click">
                    
                </hc:NotifyIcon>
//your UI elements
            </Grid>
        </Grid>
    </Border>
</Window>
  • cs
cs 复制代码
namespace NBApi.Configurator.Views;

/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
// ReSharper disable once RedundantExtendsListEntry
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }
    private void btnClose_Click(object sender, RoutedEventArgs e)
    {
        Close();
    }

    private void btnRestore_Click(object sender, RoutedEventArgs e)
    {
        if (WindowState == WindowState.Normal)
        {
            WindowState = WindowState.Maximized;
            ShowInTaskbar = false;
        }
        else
            WindowState = WindowState.Normal;

    }

    private void btnMinimize_Click(object sender, RoutedEventArgs e)
    {
        WindowState = WindowState.Minimized;
        ShowInTaskbar = false;
    }


    private void MenuItem_Click(object sender, RoutedEventArgs e)
    {

    }

    private void MenuItem_Click_1(object sender, RoutedEventArgs e)
    {

    }

    private void MenuItem_Click_2(object sender, RoutedEventArgs e)
    {

    }

    private void NotifyIconContextContent_Click(object sender, RoutedEventArgs e)
    {
        if (!IsVisible)
        {
            Show();
        }

        if (WindowState == WindowState.Minimized)
        {
            WindowState = WindowState.Normal;
        }

        Activate();
        Topmost = true;  // important
        Topmost = false; // important
        Focus();         // important
    }
}
相关推荐
Java面试题总结10 小时前
AgentScope Harness 深度实战:让Java智能体从“Demo可用”走向“生产可用”
java·开发语言·wpf
-凌凌漆-11 小时前
WPF应用层框架介绍
wpf
小满Autumn14 小时前
依赖注入设计模式速查手册
开发语言·c#·wpf·mvvm·依赖注入
Xin_ye1008614 小时前
C# 零基础到精通教程 - WPF 专题三:高级控件与自定义控件
开发语言·c#·wpf
Xin_ye1008617 小时前
C# 零基础到精通教程 - WPF 深度专题:自定义布局与性能优化
开发语言·c#·wpf
小满Autumn17 小时前
WPF 依赖属性速查手册
笔记·c#·wpf·上位机·mvvm
Xin_ye1008617 小时前
C# 零基础到精通教程 - WPF 深度专题:3D 图形与视觉增强
开发语言·c#·wpf
加号32 天前
【WPF】 自定义 Image 控件实现图像缩放与平移
wpf
闪电悠米2 天前
黑马点评-分布式锁-02_simple_redis_lock_setnx
java·数据库·spring boot·redis·分布式·缓存·wpf
闪电悠米2 天前
黑马点评-分布式锁-03_lua_atomic_unlock
java·数据库·分布式·缓存·oracle·wpf·lua