Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >分享一个 WPF 气泡弹框

分享一个 WPF 气泡弹框

作者头像
独立观察员
发布于 2022-12-06 11:14:51
发布于 2022-12-06 11:14:51
1.6K00
代码可运行
举报
运行总次数:0
代码可运行

分享一个 WPF 气泡弹框

目录

分享一个 WPF 气泡弹框

一、前言

二、参考文章介绍

三、我的修改点

1、Placement 定位示例

2、修正在有些系统环境显示错位的问题

3、更改弹框风格

4、支持设置宽高和边距

5、其它调用方式

(1)输入框点击调用

(2)通过命令调用

四、代码资源

独立观察员 2022 年 5 月 28 日

一、前言

前段时间,公司项目软件(WPF)中,有个需求是,有些显示文件夹路径的地方,由于路径可能比较长,显示不下,界面只显示出一部分,要求点击时出现气泡弹框来显示完整内容。所要求的 “气泡弹框” 其实就是类似安卓手机上那种吐司(Toast)提示框,显示几秒会自动消失的。项目中倒是有一两处已经添加了这种弹框,就是操作成功后会弹出来提示一下,但是那些是直接加在相关的 Xaml 页面中,通过控制其显示和隐藏来实现需求的。而本次涉及比较多页面,所以应该寻找一个比较通用的解决方案。

二、参考文章介绍

前面说了,需求就是实现一个类似安卓 Toast 的功能,自然而然地就进行相应的百度搜索,果然找到了一篇博文,从标题上看就很符合需求 ——《WPF 中自制类似微信消息提示框 Toast 控件》(https://blog.csdn.net/weixin_44448313/article/details/107469089),以下是原文实现的功能:

可以看到功能还是很强大的,以下是原文实现的效果(动图):

三、我的修改点

1、Placement 定位示例

动图:

这个是演示气泡弹框(Popup)定位机制中的一个叫做 Placement 的属性,代表位置;还有她配套的 PlacementTarget 属性,代表定位的目标对象;这里演示了矩形、窗口、空(Null)这三个定位目标,以及 上下左右、中间、相对、绝对 等位置;界面布局如下:

显示和隐藏通过控制 Popup 的 IsOpen 属性来实现,该属性通过样式设置绑定相关的动态资源:

在后台更改动态资源的值:

由于有些位置是重叠的,所以我给每个 Popup 中的内容(TextBlock)加了个鼠标移上会变淡的动画:

2、修正在有些系统环境显示错位的问题

这个主要是加入了一个系统左撇子、右撇子的修正方法,该方法来源于网络,用于解决 Popup 定位异常的问题,也适用于一些有下拉框的控件(因为它们的下拉框也是 Popup),比如日历控件。直接给出方法代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/// <summary>
/// 转换系统的左撇子显示模式为右撇子显示模式
/// </summary>
public static void SetAlignment()
{
    // 获取系统是以 Left-handed(true)还是 Right-handed(false)
    var ifLeft = SystemParameters.MenuDropAlignment;

    if (ifLeft)
    {
        Console.WriteLine($"系统为左撇子,转换为右撇子。");

        // change to false
        var t = typeof(SystemParameters);
        var field = t.GetField("_menuDropAlignment", BindingFlags.NonPublic | BindingFlags.Static);
        field.SetValue(null, false);

        ifLeft = SystemParameters.MenuDropAlignment;
    }
}

在窗口构造函数中调用:

其实现在看这个方法名,应该叫做 设置对齐方式。

3、更改弹框风格

由于原文是要仿安卓的 Toast,所以它的风格是那种灰色透明的小框框。而本次的使用对象是一个 Windows 的全屏应用,且风格是那种白色偏多的明快风格,所以气泡弹框也要大一些,同时改为白色风格,最终效果如下(动图):

4、支持设置宽高和边距

动图:

原版是固定的宽度,我改为了支持自动宽度,这样就能根据文字长度自动变宽。

可以注意到上图在演示长文本时,左右两个弹框的高度都比较高,但是左边的文字被截断了,而右边的能自动换行,这是为什么呢?原来左边设置的 ToastWidth,而右边设置的是 TextWidth,如下所示:

至于边距,是通过 ToastMargin 属性来设置的:

5、其它调用方式

(1)输入框点击调用

这个就是通过鼠标点击事件来触发而已(动图):

(2)通过命令调用

这个效果就不演示了,主要就是在绑定基类中添加了一个针对屏幕的弹框命令和一个针对窗体的弹框命令:

针对屏幕的命令需要一个参数,传递弹框内容;针对窗体的命令需要两个参数(通过多值绑定来传递),传递弹框内容和窗体对象:

四、代码资源

本文主要是展示一些效果,以及部分修改的代码。实现机制可以通过查看原版文章讲解以及修改前后的代码来学习了解,具体资源链接如下。

原文链接:https://blog.csdn.net/weixin_44448313/article/details/107469089

原文原始代码:https://gitee.com/DLGCY_Clone/WpfToast/tree/master/

包含修改点的原文风格代码:https://gitee.com/DLGCY_Clone/WpfToast/tree/Gray

本文对应的代码:https://gitee.com/DLGCY_Clone/WpfToast/tree/Blog20220528

最新代码(新风格):https://gitee.com/DLGCY_Clone/WpfToast/tree/dlgcy

效果:

全文完,谢谢阅读!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-05-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 独立观察员博客 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
几十款 WPF 控件 - UI 库,总有一款适合你
众所周知,使用 WPF 框架能够开发出功能强大、界面美观的桌面端应用。能够达到这个效果,各种 WPF 的控件库、UI 库功不可没。所以,想着能不能收集一下目前市面上存在的库,以便在今后需要使用的时候能够手到擒来。这不收集不知道,一收集吓一跳,竟然收集出了三十多款 UI / 控件 库,接下来就一一分享给大家。
独立观察员
2022/12/31
5.5K0
几十款 WPF 控件 - UI 库,总有一款适合你
【HarmonyOS Next】鸿蒙应用实现弹框DialogHub详解
鸿蒙中实现弹框目前官方提供openCustomDialog和CustomDialog两种模式。推荐前者,详情见下图和官网文档链接:
GeorgeGcs
2025/03/28
2540
WPF 表单验证之 INotifyDataErrorlnfo 接口的使用示例
众所周知,无论是做网站开发还是软件开发,当涉及到需要用户填写信息之后提交的操作时,我们都需要对他填写的内容进行限制和验证,这类问题可以统称为表单验证问题。本文将针对 WPF 的 TextBox 文本框,探究其中的一种验证方式 —— 使用 INotifyDataErrorInfo 在数据对象中进行验证。
独立观察员
2022/12/06
1.1K0
WPF 表单验证之 INotifyDataErrorlnfo 接口的使用示例
OxyPlot.WPF 公共属性一览
注意:本文仅供需要时参阅,无休闲阅读属性,前方高能(枯燥),非战斗人员请速速撤离。
独立观察员
2022/12/06
5.3K0
OxyPlot.WPF 公共属性一览
【HarmonyOS Next】鸿蒙应用弹框和提示气泡详解(一)
在应用开发中,弹框Dialog和提示气泡Toast使用频繁,移动开发同学较为熟悉。但在鸿蒙响应式布局里,早期的弹框Dialog和提示气泡Toast因与UI紧密绑定,在纯逻辑类文件中无法使用。
GeorgeGcs
2025/03/20
2720
【HarmonyOS Next】鸿蒙应用弹框和提示气泡详解(一)
WPF 表格控件 ReoGrid 的简单使用
ReoGrid 是一个开源的表格控件库,支持 Winform 和 WPF。本文演示在 WPF 中的使用,用的是直接加载 Excel 的方式,另外解决了触摸滑动的问题。
独立观察员
2022/12/06
4.3K0
WPF 表格控件 ReoGrid 的简单使用
WPF 笔迹算法 从点集转笔迹轮廓
本文将告诉大家一些笔迹算法,从用户输入的点集,即鼠标轨迹点或触摸轨迹点等,转换为一个可在界面绘制显示笔迹画面的基础数学算法。尽管本文标记的是 WPF 的笔迹算法,然而实际上本文更侧重基础数学计算,理论上可以适用于任何能够支持几何绘制的 UI 框架上,包括 UWP 或 WinUI 或 UNO 或 MAUI 或 Eto 等框架
林德熙
2023/11/28
5800
WPF 笔迹算法 从点集转笔迹轮廓
【WPF】Toolkit(一个项目)的要点总结
读取系统的显示语言(displayLanguage),显示语言的定义是:假如你的系统现在是中文的,你把它切换到了英文,但是英文的语言包并没有下载下来或者并没有将英文设置为显示语言,那么注销系统再登录之后,你系统显示的将还是中文。此时中文就是显示语言。
全栈程序员站长
2022/11/11
7630
[WPF]动手写一个简单的消息对话框
消息对话框是UI界面中不可或缺的组成部分,用于给用户一些提示,警告或者询问的窗口。在WPF中,消息对话框是系统原生(user32.dll)的MessageBox,无法通过Style或者Template来修改消息对话框的外观。因此,当需要一个与应用程序主题风格一致的消息对话框时,只能自己动手造轮子了。
czwy
2023/11/23
4980
[WPF]动手写一个简单的消息对话框
WPF DataGrid 如何将被选中行带到视野中
在 WPF 开发中,显示表格一般使用 DataGrid 控件,而且我们一般会依据用户的选中行的操作来执行一些逻辑,这种情况,选中了哪一行,用户是心知肚明的。而还有一种情况,我们可能在业务逻辑中,由程序自己选中了某一行,如果这一行当前不在用户界面的可视区(换句话说也就是滚动条没有滚到那个位置),那么我们如何将其带到用户的视野中呢?
独立观察员
2022/12/06
2.2K0
WPF DataGrid 如何将被选中行带到视野中
推荐一个IT老鸟肝了2月有余的免费开源WPF企业级开发框架
一个新学WPF的IT老鸟,肝了2个月做了这么一个WPF企业级开发框架,站长clone学习,觉得甚是不错。这是一个使用了Prism搭建的插件式框架,封装了DataGrid的使用,使整个框架子模块简单易学、易扩展,特别是作者还写了一个系列博客教程,值得点赞。
JusterZhu
2022/12/07
2.4K0
推荐一个IT老鸟肝了2月有余的免费开源WPF企业级开发框架
WPF 借助 FuncValueConverter 实现可显示自定义文本的通用枚举项选择弹窗
首先来解释一下标题中的 FuncValueConverter ,它并不是 WPF 中自带的,而是 B 站 UP 主 “十月的寒流” 在文章《WPF 值转换器(ValueConverter)的一些实用技巧》中,仿照 Avalonia UI 实现的一个同名转换器,具体可见 “仿照 Avalonia UI 实现一个 FuncValueConverter” 一节:
独立观察员
2025/01/13
1670
WPF 借助 FuncValueConverter 实现可显示自定义文本的通用枚举项选择弹窗
【HarmonyOS Next】鸿蒙应用弹框和提示气泡详解(二)之浮层(OverlayManager),半模态页面(bindSheet),全模态页面
上期围绕 HarmonyOS Next 最新API趋势,介绍了鸿蒙应用中最新的自定义弹框和提示气泡的使用。
GeorgeGcs
2025/03/26
2280
【HarmonyOS Next】鸿蒙应用弹框和提示气泡详解(二)之浮层(OverlayManager),半模态页面(bindSheet),全模态页面
WPF 简单实现一个支持删除自身的应用
我准备写一个逗比的应用,然而我担心被小伙伴看到这个应用的文件从而知道是我写的,于是我就需要实现让应用能自删除的功能。核心实现方法就是调用 cmd 传入命令行,等待几秒之后删除文件
林德熙
2021/10/25
4180
用Wpf做一个可编程画板(续4-Diagram画板)
1.可编程模块,使用C#语言。2.控制台打印控件,可以打印程序中的Console.WriteLine数据 3.为了便于大家使用,写了一个Box工厂分配Box的数据流向效果图。
沙漠尽头的狼
2023/08/31
3340
用Wpf做一个可编程画板(续4-Diagram画板)
WPF 用户控件分享之边上带输入框的圆圈
拿到这个需求后,分析界面上每个圆形和输入框应该视为一个用户控件,且输入框相对于圆形的位置不是一致的,所以应该要能够通过一个属性来设置输入框的位置。那么就以这个为突破口,创建一个用户控件,在代码隐藏页中添加一个用于控制输入框位置的依赖属性 “TextBoxPlacement”:
独立观察员
2022/12/06
1.2K0
WPF 用户控件分享之边上带输入框的圆圈
Winform 进度条弹窗和任务控制
最近要给一个 Winform 项目添加功能,需要一个能显示进度条的弹窗,还要求能够中止任务,所以就做了一个,在此做个记录总结。虽然用的是比较老的 Winform 技术,不过其中的原理都是相通的。
独立观察员
2022/12/06
2K0
Winform 进度条弹窗和任务控制
WPF 自定义文本框输入法 IME 跟随光标
本文非小白向,本文适合想开发自定义的文本框,从底层开始开发的文本库的伙伴。在开始之前,期望了解了文本库开发的基础知识
林德熙
2022/03/15
2K0
WPF MVVM 弹框之等待框
之前写过一篇《WPF MVVM 模式下的弹窗》,里面实现了确认框和消息框,经过一段时间的演化,目前又新增了可显示自定义内容的弹框、可进行信息录入的弹框、以及本文将要介绍的加载等待框。
独立观察员
2022/12/06
2.8K0
WPF MVVM 弹框之等待框
AgileEAS.NET 4.0重构裁剪,新的ORM、支持Linq,正式支持WPF,开放更多的接口
        很久没有和大家交流了,今天出来给大家汇报一下AgileEAS.NET平台的最新进展:          AgileEAS.NET是一套企业级的快速开发平台或者说是中间件,主要服务于中小软件企业,以提高软件企业的有效生产率为主要目标,结合软件工程、dotnet构件技术、快速工作为其提供一个适合中国特色的中小软件企业的软件生产解决方案。          AgileEAS.NET平台自2004年底出了第一版本并且应用于实际项目之中,广泛的应用于医疗、保险、互联网、铁路、房地产、农业等行业,在实际
魏琼东
2018/01/12
1.2K0
AgileEAS.NET 4.0重构裁剪,新的ORM、支持Linq,正式支持WPF,开放更多的接口
推荐阅读
相关推荐
几十款 WPF 控件 - UI 库,总有一款适合你
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验