WPF 消息提示 类似toast方式

WPF里面的消息提示一般都是MessageBox.Show(),这种样式不是很好看,所以就想办法重新搞了一个类似弹出消息的功能。原理很简单,就是弹出一个新窗体,然后等几秒窗体自动关闭。 

先上效果图:

新建一个MsgHelper.cs类,然后全局可以调用。

using System.Windows;
using System.Windows.Threading;

namespace WpfApp1;

public static class MsgHelper
{

    /// <summary>
    /// 弹出消息
    /// </summary>
    /// <param name="msg"></param>
    /// <param name="msgState"></param>
    public static void ShowMsg(string msg, MsgState msgState = MsgState.Info)
    {
        //调用之前先关闭可能已打开的窗口
        CloseWindow();
        _timer = new DispatcherTimer();
        _timer.Interval = TimeSpan.FromSeconds(2);
        _timer.Tick += _timer_Tick;
        _timer.Start();

        var mainWindow = Application.Current.Windows.OfType<MainWindow>().FirstOrDefault();
        var window = new MsgWindow(msg, msgState) { Owner = mainWindow };
        window.Show();
    }

    /// <summary>
    /// 定时器
    /// </summary>
    static DispatcherTimer _timer;

    private static void _timer_Tick(object? sender, EventArgs e)
    {
        CloseWindow();
    }
    /// <summary>
    /// 关闭窗体
    /// </summary>
    public static void CloseWindow()
    {
        if (_timer != null)
        {
            _timer.Stop();
        }
        var msgWindow = Application.Current.Windows.OfType<MsgWindow>().FirstOrDefault();
        msgWindow?.Close();
    }

    /// <summary>
    /// 消息类型
    /// </summary>
    public enum MsgState
    {
        Info,
        Success,
        Error
    }
}

 新建MsgWindow窗体,用于显示消息。样式可以自己写的好看一点,我这里就没做美化了。

MsgWindow.xaml代码如下:

<Window x:Class="WpfApp1.MsgWindow"
        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:WpfApp1"
        mc:Ignorable="d"
        Title="MsgWindow" Loaded="Window_Loaded" Height="40" Width="300" 
        Background="Transparent"
        ShowInTaskbar="False" WindowStyle="None" AllowsTransparency="True" 
        WindowStartupLocation="CenterScreen" >
    <Border BorderBrush="DarkBlue" BorderThickness="1">
        <Grid Background="White" Name="grid" >
            <TextBlock Text="" VerticalAlignment="Center" HorizontalAlignment="Center" Name="txtMsg" Margin="5"></TextBlock>
        </Grid>
    </Border>
</Window>

MsgWindow.xaml.cs

using System.Windows;
using System.Windows.Media;
using static WpfApp1.MsgHelper;

namespace WpfApp1
{
    /// <summary>
    /// MsgWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MsgWindow : Window
    {
        private string _msg = "";
        private MsgState _msgState = MsgState.Info;
        public MsgWindow(string msg, MsgState msgState)
        {
            InitializeComponent();
            _msg = msg;
            _msgState = msgState;
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            txtMsg.Text = _msg;
            switch (_msgState)
            {
                case MsgState.Info:
                    grid.Background = new SolidColorBrush(Colors.LightGray);
                    break;
                case MsgState.Success:
                    grid.Background = new SolidColorBrush(Colors.Green);
                    txtMsg.Foreground = new SolidColorBrush(Colors.White);
                    break;
                case MsgState.Error:
                    grid.Background = new SolidColorBrush(Colors.Red);
                    txtMsg.Foreground = new SolidColorBrush(Colors.White);
                    break;
            }
        }
    }
}

 然后在调用。我这里是在主窗体里面调用的,其他窗体里调用是一样的。

MainWindow.xaml代码如下:

<Window x:Class="WpfApp1.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:WpfApp1"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition></RowDefinition>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition></ColumnDefinition>
            <ColumnDefinition></ColumnDefinition>
            <ColumnDefinition></ColumnDefinition>
        </Grid.ColumnDefinitions>
        <Button Content="info" Width="100" Height="100" Click="ButtonBase_OnClick" Tag="info"></Button>
        <Button Content="success" Grid.Row="0" Grid.Column="1" Width="100" Height="100" Tag="success" Click="ButtonBase_OnClick"></Button>
        <Button Content="error" Grid.Row="0" Grid.Column="2" Width="100" Height="100" Tag="error" Click="ButtonBase_OnClick"></Button>
    </Grid>
</Window>

 MainWindow.xaml.cs

using System.Windows;
using System.Windows.Controls;
using static WpfApp1.MsgHelper;

namespace WpfApp1;

/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
    {
        if (sender is Button btn)
        {
            var tag = btn.Tag.ToString();
            var infoType = MsgState.Info;
            switch (tag)
            {
                case "info":
                    infoType = MsgState.Info;
                    break;
                case "success":
                    infoType = MsgState.Success;
                    break;
                case "error":
                    infoType = MsgState.Error;
                    break;
                default:
                    break;
            }
            MsgHelper.ShowMsg(DateTime.Now.ToString(), infoType);
        }
    }
}

 这里要注意一个问题,在调用ShowMsg()方法,有个owner要指定,我这里给的是主窗体,因为主窗体一般不会被关闭,如果是在其他窗体里面,可以把这个方法再加个参数,然后调用的地方传个this就可以。

还有就是MsgWindow的窗体的ShowInTaskbar 要设置为false,不然当鼠标移到任务栏的程序图标时,会显示有两个窗体。

也可以将MsgWindow的Topmost设置为true,这样就肯定是在最上层,但是这个最上层是所有软件的最上层,感觉不是很好。可以根据自己的需求来。

超时时间自己设置,我这里设置的是2秒。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/442261.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

神经网络 梯度与神经元参数w、b关系;梯度与导数关系

参考&#xff1a;https://blog.csdn.net/weixin_44259490/article/details/90295146 概念 梯度与w的关系可以用梯度下降公式来表示&#xff1a;ww−α ∂ c o s t ∂ w \frac{\partial cost}{\partial w} ∂w∂cost​&#xff0c;其中w表示网络的权重&#xff0c; ∂ c o s t…

AI 辅助研发趋势 - 动动嘴完成代码?

目录 2024 年 AI 辅助研发趋势 方向一&#xff1a;AI辅助研发的技术进展 方向二&#xff1a;行业应用案例 方向三&#xff1a; 面临的挑战与机遇 方向四&#xff1a;未来趋势预测 方向五&#xff1a;与法规的影响 方向六&#xff1a;人才培养与教育 2024 年 AI 辅助研发…

141 Linux 系统编程18 ,线程,线程实现原理,ps –Lf 进程 查看

一 线程概念 什么是线程 LWP&#xff1a;light weight process 轻量级的进程&#xff0c;本质仍是进程(在Linux环境下) 进程&#xff1a;独立地址空间&#xff0c;拥有PCB 线程&#xff1a;有独立的PCB&#xff0c;但没有独立的地址空间(共享) 区别&#xff1a;在于是否共…

CorelDRAW Essentials2024使用简单易学的图形软件,让设计充满乐趣

CorelDRAW Essentials 2024使用简单易学的图形软件&#xff0c;让设计充满乐趣 创作引人注目的海报、卡片、社交媒体图片等。 增强功能&#xff01;支持文件导入/导出新增功能&#xff01;支持 WebP 文件&#xff0c;提高网页兼容性并优化图像交付增强功能&#xff01;显著的…

服务器租用和托管的区别

目前对于服务器要求相对高的企业会希望使用独立服务器来运行自己的网站&#xff0c;而在选择独立服务器业务事&#xff0c;是使用服务器托管还是服务器租用这两种方法时&#xff0c;许多刚进入网络或者传统行业的从业者&#xff0c;都不太了解什么是服务器&#xff0c;现在我来…

RabbitMQ 安装使用

文章目录 RabbitMQ 安装使用安装下载 Erlang下载 RabbitMQ 的服务安装好后看是否有 RabbitMQ 的服务开启管理 UIRabbitMQ 端口使用一览图 使用输出最简单的 Hello World&#xff01;生产者定义消费者消费消息小拓展 RabbitMQ 安装使用 安装 下载 Erlang RabbitMQ 是用这个语…

ai写作一键生成文章速度快

ai写作是一种基于人工智能技术的自动写作工具&#xff0c;它可以根据用户提供的主题或关键词&#xff0c;快速一键生成文章。与传统的手动写作相比&#xff0c;ai写作的速度更快&#xff0c;效率更高。下面小编就带大家一起来见识下ai写作一键生成文章的速度是如何之快&#xf…

string 底层模拟实现常用接口

目录 前言 什么是string? 为什么要学习使用string&#xff1f;string的优势&#xff1f; 因此&#xff0c;string类的成员变量也如图顺序表一样&#xff0c;如下图所示&#xff1a; 构造函数 拷贝构造 析构函数 size() 、capacity&#xff08;&#xff09; operato…

【C++】什么是类与对象?

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:C ⚙️操作环境:Visual Studio 2022 目录 面向对象概述 封装 继承 多态 类 类是什么? C中类的引入 C中类的定义 类的两种定义方式: 1.声明和定义全部放在类体中 2.类声明与成员函数定义分别放在不同的工程文件中…

C语言数据结构之二叉堆

愿你千山暮雪 海棠依旧 不为岁月惊扰平添忧愁 &#x1f3a5;前期回顾-二叉树 &#x1f525;数据结构专栏 期待小伙伴们的支持与关注&#xff01;&#xff01;&#xff01; 目录 前期回顾 二叉堆的概念及结构 二叉堆的创建 顺序表的结构声明 顺序表的创建与销毁 二叉堆的插入 …

CUDA安装及环境配置——最新详细版

确定安装版本 在安装之前呢&#xff0c;我们需要确定三件事 第一&#xff1a;查看显卡支持的最高CUDA的版本&#xff0c;以便下载对应的CUDA安装包 第二&#xff1a;查看对应CUDA对应的VS版本&#xff0c;以便下载并安装对应的VS版本&#xff08;vs需要先安装&#xff09; 第三…

基于Jupyter快速入门Python,Numpy,Scipy,Matplotlib

文章目录 Jupyter 和 Colab 笔记本PythonPython 版本基础数据类型数字Numbers布尔值Booleans字符串Strings 容器列表List字典Dictionaries集合Sets元组Tuples 函数类 Numpy数组Array数组索引Array indexing数据类型DatatypesArray math广播Broadcasting Scipy图像操作MATLAB文件…

IOS覆盖率报告info文件解读

一&#xff0c;IOS覆盖率报告的生成 在做前端精准测试的时候&#xff0c;对于iOS端&#xff0c;通常会做如下操作&#xff1a; &#xff08;1&#xff09;合并覆盖率数据 如下操作&#xff1a; xcrun llvm-profdata merge coverage_file1657885040728.profraw coverage_fil…

Java 可变长参数

可变长参数定义 从 Java5 开始&#xff0c;Java 支持定义可变长参数&#xff0c;所谓可变长参数就是允许在调用方法时传入不定长度的参数。可变长参数允许方法接受任意多个相同类型的参数&#xff0c;在方法内部可以将这些参数视为数组来处理。可变长参数通过省略号&#xff0…

【洛谷 P8668】[蓝桥杯 2018 省 B] 螺旋折线 题解(数学+平面几何)

[蓝桥杯 2018 省 B] 螺旋折线 题目描述 如图所示的螺旋折线经过平面上所有整点恰好一次。 对于整点 ( X , Y ) (X, Y) (X,Y)&#xff0c;我们定义它到原点的距离 dis ( X , Y ) \text{dis}(X, Y) dis(X,Y) 是从原点到 ( X , Y ) (X, Y) (X,Y) 的螺旋折线段的长度。 例如 …

java SSM汽车租赁管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM汽车租赁管理系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用…

【Docker】了解Docker Desktop桌面应用程序,TA是如何管理和运行Docker容器(3)

欢迎来到《小5讲堂》&#xff0c;大家好&#xff0c;我是全栈小5。 这是《Docker容器》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对…

MySQL实战:SQL优化及问题排查

有更合适的索引不走&#xff0c;怎么办&#xff1f; MySQL在选取索引时&#xff0c;会参考索引的基数&#xff0c;基数是MySQL估算的&#xff0c;反映这个字段有多少种取值&#xff0c;估算的策略为选取几个页算出取值的平均值&#xff0c;再乘以页数&#xff0c;即为基数 查…

Springboot+vue的项目申报管理系统(有报告)。Javaee项目,springboot vue前后端分离项目。

演示视频&#xff1a; Springbootvue的项目申报管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot vue前后端分离项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09…

盲盒抽卡机小程序——开启神秘之旅!

亲爱的朋友们&#xff0c;欢迎来到盲盒抽卡机小程序&#xff01;这里&#xff0c;是一个充满神秘与惊喜的世界&#xff0c;让你随时随地体验抽卡的乐趣。在这里&#xff0c;你可以轻松尝试各种盲盒&#xff0c;发现隐藏的宝藏&#xff0c;感受心跳加速的刺激。 【丰富多样的盲…