C# WPF 仿 Android Toast 效果

news2024/11/25 16:53:02

转载请注明出处: https://blog.csdn.net/hx7013/article/details/142860084

主职Android, 最近需要写一些WPF的程序作为上位机,目前WPF的MessageBox过于臃肿,且想找一个内置的非阻塞的简单提示一直找不到,想到了Android的Toast所以写了这个扩展方法。
调用简单,一行代码调用 this.ShowToast("") ,支持自定义关闭时间,手动关闭,文本颜色、背景颜色等。做了非主线程调用的处理,参数也加了注释方便个人扩充。

效果演示

https://blog.csdn.net/hx7013
https://blog.csdn.net/hx7013

代码

使用

记得using扩展方法

    public partial class TestWindow : Window
    {
        public TestWindow()
        {
            InitializeComponent();
        }

        private void BTN_TestToast_Click(object sender, RoutedEventArgs e)
        {
            this.ShowToast("仿 Android Toast\n这里是手动换行\n这里是过长后自动换行(1234567890ABCDEFGHIJKLMN)");
        }
    }

Toast扩展方法

using System.Windows.Controls.Primitives;
using System.Windows.Controls;
using System.Windows.Threading;
using System.Windows;
using System.Windows.Media;

namespace WinManage
{
    public static class UIExtensions
    {

        /// <summary>
        /// 最后一次Toast
        /// </summary>
        private static Popup? lastToast = null;

        /// <summary>
        /// Toast 提示
        /// https://blog.csdn.net/hx7013
        /// </summary>
        /// <param name="target">目标窗口</param>
        /// <param name="message">消息内容</param>
        /// <param name="single">是否单例显示(true 会自动关闭上一个单例的Popup)</param>
        /// <param name="duration">显示时长(秒), >0则自动关闭, <=0 则需手动关闭</param>
        /// <param name="fontSize">字体大小</param>
        /// <param name="textColor">文本颜色</param>
        /// <param name="background">背景</param>
        /// <returns>Popup: 外部可使用 Popup.IsOpen = false; 手动关闭</returns>
        public static Popup ShowToast(this Window target, string message, bool single = true, int duration = 2, double fontSize = 15, Brush? textColor = null, Brush? background = null)
        {
            Popup show()
            {


                TextBlock textBlock = new()
                {
                    Text = message,
                    FontSize = fontSize,
                    Padding = new Thickness(12, 0, 12, 0),
                    MaxWidth = 320,
                    TextWrapping = TextWrapping.Wrap,
                    Foreground = textColor ?? Brushes.White,
                    HorizontalAlignment = HorizontalAlignment.Center,
                    VerticalAlignment = VerticalAlignment.Center
                };

                Border border = new()
                {
                    Background = background ?? new SolidColorBrush(Color.FromArgb(200, 0, 0, 0)),
                    CornerRadius = new CornerRadius(10),
                    Padding = new Thickness(10),
                    Child = textBlock
                };

                // 测量文本的实际大小
                border.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
                double actualTextWidth = border.DesiredSize.Width;
                double horizontalOffset = (target.Width + actualTextWidth) / 2;

                Popup toast = new()
                {
                    Placement = PlacementMode.Relative,
                    PlacementTarget = target,
                    HorizontalOffset = horizontalOffset,
                    VerticalOffset = target.Height - 128,
                    AllowsTransparency = true,
                    Child = border,
                    IsOpen = true,
                };

                if (single)
                {
                    var localLastToast = lastToast;
                    if (localLastToast != null)
                    {
                        localLastToast.IsOpen = false;
                        lastToast = null;
                    }
                    lastToast = toast;
                }

                // 自动关闭 Popup
                if (duration > 0)
                {
                    DispatcherTimer timer = new()
                    {
                        Interval = TimeSpan.FromSeconds(duration)
                    };
                    timer.Tick += (s, e) =>
                    {
                        if (toast != null && toast.IsOpen)
                        {
                            toast.IsOpen = false;
                        }
                        timer.Stop();
                    };
                    timer.Start();
                }
                return toast;
            }

            var dispatcher = Application.Current.Dispatcher;
            if (dispatcher.CheckAccess())
            {
                return show();
            }
            else
            {
                return dispatcher.Invoke(() => show());
            }
        }
    }
}

转载请注明出处: https://blog.csdn.net/hx7013/article/details/142860084

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

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

相关文章

Kafka之生产者

本章内容将整理下Kafka体系结构中的生产者相关的一些知识。 1. 生产者客户端 生产者客户端在Kafka的发展历程当中一共有两个重大版本&#xff1a; 一个是基于Scala语言开发的版本&#xff0c;称为Old Producer或Scala版的生产者客户端。一个是Kafka0.9.x版本之后以Java语言开发…

《深度学习》OpenCV 光流估计 原理、案例解析

目录 一、光流估计 1、什么是光流估计 2、原理 3、光流估计算法 1&#xff09;基于局部方法 2&#xff09;和基于全局方法 4、光流估计的前提 1&#xff09;亮度恒定 2&#xff09;小运动 3&#xff09;空间一致 二、案例实现 1、读取视频 2、特征检测 3、处理每…

Python | Leetcode Python题解之第474题一和零

题目&#xff1a; 题解&#xff1a; class Solution:def findMaxForm(self, strs: List[str], m: int, n: int) -> int:count10 []for s in strs:count10.append([0,0])for c in s:if c 0: count10[-1][0]1else: count10[-1][1]1dp [[0]*(n1) for _ in range(m1)]for i …

十一、数据库的设计规范

文章目录 1. 为什么需要数据库设计2. 范式2.1 范式介绍2.2 范式都包括哪些2.3 键和相关属性的概念2.4 第一范式(1st NF)2.5 第二范式(2nd NF)2.6 第三范式(3rd NF)2.7 小结3. 反范式化3.1 概述3.2 应用举例3.3 反范式的新问题3.4 反范式的使用场景3.4.1 增加冗余字段的建议3.…

windows系统更新升级node指定版本【避坑篇!!!亲测有效】(附带各版本node下载链接)一定看到最后!不用删旧版!

Node.js 是一个开源、跨平台的 JavaScript 运行时环境&#xff0c;广泛应用于服务器端和网络应用的开发。随着 Node.js 版本的不断更新&#xff0c;我们可能需要升级到特定版本以满足项目需求或修复安全漏洞。又或者是学习开发另外一个新项目&#xff0c;新项目对Node版本要求更…

上交大全华班复现o1旅程式学习下的深思考

因篇幅限制不重复原研究内容&#xff0c;建议访问原技术报告链接精读&#xff0c;这里主要向大伙表示我对上交大本此研究所涉三方面的价值认同及更进一步的延展思考。 价值认同&#xff1a; ① 深刻洞察&#xff1a;系统性研究并阐释旅程式学习&#xff1b; ② 行业促进&…

SQL Injection | MySQL 数据库概述

关注这个漏洞的其他相关笔记&#xff1a;SQL 注入漏洞 - 学习手册-CSDN博客 0x01&#xff1a;MySQL 数据库简介 MySQL 是一个流行的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;它基于 SQL &#xff08;Structured Query Language&#xff09;进行操作。My…

Django项目的创建及说明(详细图解版)

Django项目的创建及说明 1、安装Django2、创建项目2.1、利用终端创建项目2.2、利用Pycharm企业版创建项目 3、默认文件介绍 1、安装Django 在终端输入下述命令行。 pip install django安装成功后执行如下命令查看Django是否安装好&#xff0c;若正确显示出Django版本号则安装…

[实时计算flink]应用场景

本文将以部门场景和技术领域场景为例&#xff0c;为您介绍实时计算Flink版的大数据是实时化场景。 背景信息 作为流式计算引擎&#xff0c;Flink可以广泛应用于实时数据处理领域&#xff0c;例如ECS在线服务日志&#xff0c;IoT场景下传感器数据等。同时Flink还能订阅云上数据…

进程的那些事--进程间的通信(重点说明管道和共享内存)

目录 前言 一、初始进程间通信 二、管道 1.匿名管道 2.命名管道 三、共享内存 四、消息队列&#xff08;了解&#xff09; 五、信号量&#xff08;了解&#xff09; 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 进程是一个能够独立运行&#…

什么情况下数据库和缓存不一致?

首先&#xff0c;在非并发的场景中&#xff0c;出现不一致的问题大家都能比较容易的理解&#xff0c;因为缓存的操作和数据库的操作是存在一定的时间差的。而生两个操作是没办法保证原子些的&#xff0c;也就是说&#xff0c;是有可能一个操作功&#xff0c;一个操作失败的。所…

C语言-数据结构 折半查找

在折半查找中&#xff0c;刚开始学可能会在下标处产生困惑&#xff0c;例如奇数个长度的数组怎么处理&#xff0c;偶数个长度的数组怎么处理&#xff0c;不需要修改代码吗&#xff1f;并且下标我从1开始算和0开始算影响代码吗&#xff1f;其实都可以用一样的代码&#xff0c;产…

【含文档】基于Springboot+Vue的失物招领系统(含源码+数据库+lw)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统定…

如何替换OCP节点(一):使用oat | OceanBase应用实践

前言&#xff1a; OceanBase Cloud Platform&#xff08;简称OCP&#xff09;&#xff0c;是 OceanBase数据库的专属企业级数据库管理平台。 在实际生产环境中&#xff0c;OCP的安装通常是第一步&#xff0c;先搭建OCP平台&#xff0c;进而依赖OCP来创建、管理和监控我们的生…

docker升级mysql

一、首选备份原数据库所有数据 二、在Docker中查看正在运行的MySQL容器名称&#xff0c;可以使用以下命令&#xff1a; docker ps --filter "namemysql" 三、查看当前docker中正在运行mysql的版本 docker exec -it qgz-mysql mysql -V 可以看到当前运行的版本是8.…

数据传输——差错控制

一、检错纠错 1、通信链路不是完全理想的&#xff0c;在传输的过程中可能会产生比特差错。 2、误码率&#xff1a;传输错误的比特占所传输比特总数的比率。 3、检错&#xff1a;能自动发现差错。 4、纠错&#xff1a;不仅能发现差错而且能自动纠正差错。 5、码字(codeword…

Selenium打开外部应用程序的弹窗处理

问题 selenium自动化操作页面跳转到外部应用程序进行下载等操作&#xff0c;各种窗口处理方式无法解决 原因 该窗口属于浏览器窗口&#xff0c;与访问页面无关&#xff08;已经脱离页面操作层面&#xff09; 解决 selenium启动浏览器时&#xff0c;对浏览器进行相关窗口设…

Elasticsearch的安装与配置

注意&#xff1a;elasticsearch 禁止安装在/root路径下&#xff01; 1、创建用户组 groupadd elastic 2、创建用户 useradd es -d /home/es -g elastic echo es | passwd es --stdin 3、给新创建的用户进行授权 chown -R es:elastic /home/es chmod -R 775 /home/es 4…

sklearn机器学习实战——支持向量机四种核函数分类任务全过程(附完整代码和结果图)

sklearn机器学习实战——支持向量机四种核函数分类任务全过程&#xff08;附完整代码和结果图&#xff09; 关于作者 作者&#xff1a;小白熊 作者简介&#xff1a;精通python、matlab、c#语言&#xff0c;擅长机器学习&#xff0c;深度学习&#xff0c;机器视觉&#xff0c;目…

Nginx反向代理配置与负载均衡配置

简介&#xff1a;整理自黑马程序员苍穹外卖的第11节 nginx是什么&#xff1f; nginx的好处 nginx反向代理配置方式 nginx负载均衡的配置方式 nginx负责均衡策略