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秒。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

海外互联网专线主要解决企业哪些办公问题?

海外互联网专线 是一种专门为跨境企业提供的网络连接服务&#xff0c;旨在解决企业在海外办公过程中遇到的各种网络问题。海外互联网专线如何成为解决企业办公难题的利器&#xff0c;为企业提供稳定、高速的网络连接? 1、跨国远程办公&#xff1a; 随着全球化进程的加速&…

Android应用界面

概述&#xff1a;由于学校原因&#xff0c;估计会考&#xff0c;曹某人就浅学一下。 目录 View概念 创建和使用布局文件 相对布局 线性布局 水平线性布局 垂直线性布局 表格布局 帧布局 扁平化布局 Android控件详解 AdapterView及其子类 View概念 安卓中的View是所…

Codesys.运动控制电子齿轮

文章目录 一. 电子齿轮概念应用 二. 电子齿轮耦合功能块 2.1. MC_GearIn 2.2. MC_GearInPos 2.3. MC_GearOut 三. 电子齿轮案例 3.1. 样例介绍 3.2. 引入虚轴 3.3. 程序框架 3.4. 程序编写 3.5. 程序监控 一. 电子齿轮概念应用 在很多应用场景中有多个牵引轴每个牵引…

【重温设计模式】备忘录模式及其Java示例

备忘录模式的概述 在软件设计的世界中&#xff0c;备忘录模式是一种行为设计模式&#xff0c;它的主要作用是保存对象的当前状态&#xff0c;以便在将来的某个时间点&#xff0c;可以将对象恢复到这个保存的状态。这种模式的命名源于生活中的备忘录&#xff0c;我们常常用它来…

俄罗斯方块h5源码

上传源码至服务器和空间即可使用&#xff0c;源码无后门&#xff0c;就一天html文件&#xff0c;一个两个css文件以及一个js文件 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/88897605 更多资源下载&#xff1a;关注我。

148个Chatgpt关键词汇总-有爱AI实战教程(二)

演示站点&#xff1a; https://ai.uaai.cn 技能模块 官方论坛&#xff1a; www.jingyuai.com 京娱AI 导读&#xff1a;在使用 ChatGPT 时&#xff0c;当你给的指令越精确&#xff0c;它的回答会越到位&#xff0c;举例来说&#xff0c;假如你要请它帮忙写文案&#xff0c;如…

devops-Maven【部署及配置】

1、准备maven工具包&#xff0c;Maven官网下载Maven的安装包 Maven – Download Apache Maven Index of /maven (apache.org) 选择后缀是.bin.tar.gz的文件下载&#xff0c;此处下载的版本是3.9.6。 2、安装maven的目录下&#xff0c;建一个Maven路径&#xff0c;然后把压缩…

JAVA虚拟机实战篇之内存调优[5](诊断和解决问题-两种方式总结)

文章目录 版权声明诊断和解决问题 - 两种方案在线定位问题步骤在线定位问题 – btrace 总结内存溢出&内存泄漏内存溢出原因解决内存泄漏方法 版权声明 本博客的内容基于我个人学习黑马程序员课程的学习笔记整理而成。我特此声明&#xff0c;所有版权属于黑马程序员或相关权…

探索数据可视化:Matplotlib 基础指南

图形绘制 import numpy as np import pandas as pd import matplotlib.pyplot as pltx np.linspace(0,2 * np.pi,100)# 说明&#xff1a;正弦波。x&#xff1a;NumPy数组 # 所有的数据&#xff0c;进行正弦计算 y np.sin(x)plt.plot(x,y)# 指定x轴范围 plt.xlim(-1,10) # 指…

746. 使用最小花费爬楼梯 (Swift版本)

题目 给你一个整数数组 cost&#xff0c;其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用&#xff0c;即可选择向上爬一个或者两个台阶。 你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。 请你计算并返回达到楼梯顶部的最低花费。 限制条件 2…

智能合约语言(eDSL)—— proc_macro实现合约init函数

我们通过属性宏来实现合约的init函数&#xff0c;call函数其实和init是类似的&#xff1b; GitHub - XuHugo/xwasm 构建属性宏&#xff0c;要在cargo.toml里面设置一些参数&#xff0c;这是必须的。一般来说&#xff0c;过程宏必须是一个库&#xff0c;或者作为工程的子库&…

thingsboard如何自定义udp-transport

0、参考netty实现udp的文章 https://github.com/narkhedesam/Netty-Simple-UDP-TCP-server-client/blob/master/netty-udp/src/com/sam/netty_udp/server/MessageDecoder.java 调试工具使用的是:卓岚TCP&UDP调试工具 1、在common\transport下面创建udp模块,仿照mqtt的创…

Linux配置.bashrc文件导致各种命令(vim、sudo)失效。

Linux配置.bashrc文件导致各种命令&#xff08;vim、sudo&#xff09;失效。 起因是 nvcc-V一直报错&#xff1a;-bash&#xff1a;nvcc&#xff1a; command not found 踩坑记录&#xff1a;上网一查说是没有配置cuda的环境变量。于是去修改了bashrc文件&#xff0c;在最下面…

一次生产环境上的dockerd启动失败原因分析

今夜原计划对 生产环境 上的 SDN 组件进行一次紧急扩容操作的&#xff0c;但业务基础环境中的 Docker-Engine 启动不起来了、原定计划也就无法继续进行了。 尽管查清了基础业务环境中的故障原因&#xff0c;但金主DD说今天先不干了&#xff0c;那就整理整理思路写篇流水账吧 。…

【漏洞复现】帮管客 CRM jiliyu SQL注入漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

ubuntu下vscode+STM32CubeMX+openocd+stlinkv2搭建STM32开发调试下载环境

1、换源 清华源 # 默认注释了源码镜像以提高 apt update 速度&#xff0c;如有需要可自行取消注释 deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restr…

nginx-排查一次大文件无法正常下载问题

目录 问题现象&报错信息 问题现象以及分析 nginx报错信息 问题解决 方法1&#xff1a;配置proxy_max_temp_file_size 方法2&#xff1a;关闭proxy_buffering 参考文档 问题现象&报错信息 问题现象以及分析 文件正常从后端服务器直接下载时&#xff0c;一切正常…

通过esp32cam拍摄图片上传至PC并通过YOLO进行目标检测

通过esp32cam拍摄图片上传至PC并通过YOLO进行目标检测 一.通过esp32cam拍摄照片并上传至PC二.训练自己的数据集三.AutoDL AI算力云的使用1.账号注册2.GPU选取3.GPU使用4.开机训练 四.数据集的使用 一.通过esp32cam拍摄照片并上传至PC 文章链接: https://blog.csdn.net/qq_6297…

北京市气象站点日值数据(降雨气温风速日照蒸发气压地温湿度)

气象数据一直是一个价值较高的数据&#xff0c;它被广泛用于各个领域的研究当中。气象数据包括有气温、气压、相对湿度、降水、蒸发、风向风速、日照等多种指标&#xff0c;但是包含了这些全部指标的气象数据却较难获取&#xff0c;即使获取到了也不能随意分享。 北京&#xf…

学习JavaEE日子 Day24 TreeSet,内置比较器,外置比较器,HashMap

Day24 TreeSet 1.TreeSet 1.1 TreeSet的使用 注意&#xff1a;TreeSet的使用和HashSet一样 public class Test01 {public static void main(String[] args) {//创建TreeSet集合的对象TreeSet<String> set new TreeSet<>();//添加元素set.add("麻生希"…