WPF 实现一个酷酷的Loading

5bd2de5a48b676a110afd986b1532b99.png

WPF开发者QQ群: 340500857  | 微信群 -> 进入公众号主页 加入组织

      由于微信群人数太多入群请添加小编微信号

(yanjinhuawechat)或(W_Feng_aiQ)入群

(需备注WPF开发者

  PS:有更好的方式欢迎推荐。

01

代码如下

一、创建 RingLoading.cs 继承 Control代码如下。

559e7f58aa1a027b554607b412c32e74.png

using System.Windows;
using System.Windows.Controls;namespace WPFDevelopers.Controls
{public class RingLoading : Control{static RingLoading(){DefaultStyleKeyProperty.OverrideMetadata(typeof(RingLoading), new FrameworkPropertyMetadata(typeof(RingLoading)));}public bool IsStart{get { return (bool)GetValue(IsStartProperty); }set { SetValue(IsStartProperty, value); }}public static readonly DependencyProperty IsStartProperty =DependencyProperty.Register("IsStart", typeof(bool), typeof(RingLoading), new PropertyMetadata(default));public double Progress{get { return (double)GetValue(ProgressProperty); }set { SetValue(ProgressProperty, value); }}public static readonly DependencyProperty ProgressProperty =DependencyProperty.Register("Progress", typeof(double), typeof(RingLoading), new PropertyMetadata(default));public double Maximum{get { return (double)GetValue(MaximumProperty); }set { SetValue(MaximumProperty, value); }}public static readonly DependencyProperty MaximumProperty =DependencyProperty.Register("Maximum", typeof(double), typeof(RingLoading), new PropertyMetadata(1d));public string Description{get { return (string)GetValue(DescriptionProperty); }set { SetValue(DescriptionProperty, value); }}public static readonly DependencyProperty DescriptionProperty =DependencyProperty.Register("Description", typeof(string), typeof(RingLoading), new PropertyMetadata(default));}
}

二、RingLoading.xaml 代码如下

<Style TargetType="controls:RingLoading" BasedOn="{StaticResource ControlBasicStyle}"><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="controls:RingLoading"><ControlTemplate.Resources><Storyboard x:Key="PART_Resource_Storyboard" RepeatBehavior="Forever"><DoubleAnimation To="-495" Duration="0:0:1.5" Storyboard.TargetName="PART_Ring1"  Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[2].(RotateTransform.Angle)"/><DoubleAnimation To="585" Duration="0:0:1.5" Storyboard.TargetName="PART_Ring2"  Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[2].(RotateTransform.Angle)"/><DoubleAnimation To="-315" Duration="0:0:1.5" Storyboard.TargetName="PART_Ring3"  Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[2].(RotateTransform.Angle)"/></Storyboard></ControlTemplate.Resources><Grid><Grid.RowDefinitions><RowDefinition Height="*"/><RowDefinition Height="Auto"/></Grid.RowDefinitions><Viewbox HorizontalAlignment="Center" VerticalAlignment="Center" ><Border Padding="10" Width="100" Height="100" ><Grid><Grid x:Name="PART_Ring1" Width="60" Height="60" HorizontalAlignment="Center" VerticalAlignment="Top" RenderTransformOrigin="0.5,0.5"><Grid.RenderTransform><TransformGroup><ScaleTransform/><SkewTransform/><RotateTransform Angle="-135"/><TranslateTransform/></TransformGroup></Grid.RenderTransform><Ellipse Stroke="Red" StrokeThickness="2" StrokeDashArray="23 100" RenderTransformOrigin="0.5,0.5"/><Border Width="10" Height="10" CornerRadius="10" Background="Red" HorizontalAlignment="Right" Margin="0,0,-4,0"><Border.Effect><DropShadowEffect BlurRadius="10" ShadowDepth="0" Color="Red"/></Border.Effect></Border></Grid><Grid x:Name="PART_Ring2" Width="60" Height="60" HorizontalAlignment="Left" VerticalAlignment="Bottom" RenderTransformOrigin="0.5,0.5"><Grid.RenderTransform><TransformGroup><ScaleTransform/><SkewTransform/><RotateTransform Angle="225"/><TranslateTransform/></TransformGroup></Grid.RenderTransform><Ellipse Stroke="Purple" StrokeThickness="2" StrokeDashArray="23 100"/><Border Width="10" Height="10" CornerRadius="10" Background="Purple" VerticalAlignment="Bottom" HorizontalAlignment="Center" Margin="0,0,0,-4"><Border.Effect><DropShadowEffect BlurRadius="10" ShadowDepth="0" Color="Purple"/></Border.Effect></Border></Grid><Grid x:Name="PART_Ring3" Width="60" Height="60" HorizontalAlignment="Right" VerticalAlignment="Bottom" RenderTransformOrigin="0.5,0.5"><Grid.RenderTransform><TransformGroup><ScaleTransform/><SkewTransform/><RotateTransform Angle="45"/><TranslateTransform/></TransformGroup></Grid.RenderTransform><Ellipse Stroke="#0fb8b2" StrokeThickness="2" StrokeDashArray="23 100"/><Border Width="10" Height="10" CornerRadius="10" Background="#0fb8b2" HorizontalAlignment="Right" Margin="0,0,-4,0"><Border.Effect><DropShadowEffect BlurRadius="10" ShadowDepth="0" Color="#0fb8b2"/></Border.Effect></Border></Grid></Grid></Border></Viewbox><StackPanel Grid.Row="1" Grid.ColumnSpan="2" Margin="10"><TextBlock HorizontalAlignment="Center" Text="Loading..." Margin="0,0,0,15"/><TextBlock HorizontalAlignment="Center" Text="{TemplateBinding Description}" Margin="0,0,0,15"/><TextBlock HorizontalAlignment="Center" Text="{TemplateBinding Progress}" FontSize="{StaticResource TitleFontSize}" FontWeight="Bold"/></StackPanel></Grid><ControlTemplate.Triggers><Trigger Property="IsStart" Value="True"><Trigger.EnterActions><BeginStoryboard Storyboard="{StaticResource PART_Resource_Storyboard}" x:Name="PART_BeginStoryboard"/></Trigger.EnterActions><Trigger.ExitActions><StopStoryboard BeginStoryboardName="PART_BeginStoryboard"/></Trigger.ExitActions></Trigger></ControlTemplate.Triggers></ControlTemplate></Setter.Value></Setter>
</Style>

02


效果预览

鸣谢素材提供者 - 吴锋

源码地址如下

github:https://github.com/yanjinhuagood/WPFDevelopers.git

gitee:https://gitee.com/yanjinhua/WPFDevelopers.git

WPF开发者QQ群: 340500857 

blogs: https://www.cnblogs.com/yanjinhua

Github:https://github.com/yanjinhuagood

出处:https://www.cnblogs.com/yanjinhua

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

转载请著名作者 出处 https://github.com/yanjinhuagood

1514cc6c10137f90f89963c29b5c37a8.png

扫一扫关注我们,

68113170e483edaa25daaa7eff5c0785.gif

更多知识早知道!

bbdb3059bd55a64724c782c76488841e.gif

点击阅读原文可跳转至源代码

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

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

相关文章

DNS区域委派与转发

DNS区域委派与转发 DNS 是域名系统 (Domain Name System) 的缩写&#xff0c;该系统用于命名组织到域层次结构中的计算机和网络服务。在Internet上域名与IP地址之间是一一对应的&#xff0c;域名虽然便于人们记忆&#xff0c;但机器之间只能互相认识IP地址&#xff0c;它们之间…

惊了!哆啦A梦里最能打的道具,居然真实存在!还打破了世界纪录,看完跪了....

全世界只有3.14 % 的人关注了爆炸吧知识生活处处有科学《哆啦A梦》里的空气炮&#xff0c;是很多人童年时梦寐以求的神奇道具。只要将手伸进炮筒&#xff0c;就能发出强大的压缩空气炮&#xff0c;瞬间击倒体型庞大的怪物。为了证明“空气炮”的确有科学依据&#xff0c;有这么…

Android之如何解决Android Studio左边的的project不见了

今早上一打开Android studio,尼玛&#xff0c;我的project跑哪里去了&#xff0c;郁闷了&#xff0c;如下图 本来是要去问我师傅的&#xff0c;但是一想这么简单的问题也去问&#xff0c;弱爆了&#xff0c;如果在网上找不到解决问题的办法再去问吧&#xff0c;果然找到了&…

Win11推送加速!

微软宣布 Windows 11 现已开始向更多符合条件的 Windows 10 电脑推送。微软表示&#xff1a;无论是推广经验还是用户反馈&#xff0c;都是积极的。因此我们计划扩大 Windows 11 的推送范围&#xff0c;这比我们之前预期的要快。如果您有符合升级条件的 Windows 10 电脑&#xf…

h5通过php微信支付宝支付,用H5调用支付微信公众号支付的解析

这篇文章主要为大家详细介绍了微信公众号支付H5调用支付,具有一定的参考价值&#xff0c;感兴趣的小伙伴们可以参考一下最近项目需要微信支付&#xff0c;然后看了下微信公众号支付&#xff0c;虽然不难&#xff0c;但是细节还是需要注意的&#xff0c;用了大半天时间写了个dem…

这场戏里,到底是谁脏了?

1 让我表演个背包袱&#xff01;▼2 猝不及防的劈叉&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼3 就很出戏&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼4 意识流拔河很有感觉了▼5 纯爱&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼6 …

Android之如何解决刚下载的Android studio(包括上面的菜单栏)乱码问题

这个问题是我的台式机第一次下载Andorid studio的时候出现的,这台台式机组装的,是之前玩ps的人用了的,感觉怪怪的,第一次安装Android studio不是很熟悉,出现了乱码,包括菜单栏目,只有部分图片了,没有全部图片了 解决这个问题的总共思路: 思路一: 请教了那…

关于高级导数的一个不等式估计

from: http://math.fudan.edu.cn/gdsx/XXYD.HTM

体验.NET Core使用IKVM对接Java

【导读】与第三方对接最麻烦的是语言不同&#xff0c;因语言不同内置实现相关标准加密算法还是略微有所差异对接单点登录场景再寻常不过&#xff0c;由于时间紧迫且对接方使用Java&#xff0c;所以留给我对接开发和联调的时间本就不多&#xff0c;于是乎&#xff0c;在熬夜发版…

对硕士而言,编制和稳定究竟有多重要?

随着考研大战如火如荼&#xff0c;2021研究生报考数目再创新高&#xff0c;越来越多的学生选择继续深造&#xff0c;进入更高的学府&#xff0c;为自己的学历镀金。然而现实是&#xff0c;很多的人毕业后并不一定比本科生拥有明显的优势&#xff0c;包括在体制内的工作&#xf…

无需Windbg | 使用VS 2019调试.NET程序的Crash异常

前言某台服务器上的IIS应用程序池&#xff0c;最近经常会自动关闭。查看服务器上的事件日志&#xff0c;发现在关闭时&#xff0c;w3p.exe抛出了stackoverflow异常。幸好&#xff0c;Windows自动帮我们抓取了Crash的dump文件&#xff1a;一般来说&#xff0c;我们会使用windbg来…

被夸了几十年,地球都要因为它变秃了,你还天天用它......

全世界只有3.14 % 的人关注了爆炸吧知识纸袋的流行不是环保要的结果模友们&#xff0c;“限塑令”在中国已经实行12年了&#xff0c;惊讶不&#xff1f;经过12年的努力&#xff0c;塑料袋终于不在大街上明目张胆的漫天飞舞。超模君相信大家都有一个共同认知&#xff1a;塑料袋污…

Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)(转)

互联网的发展&#xff0c;网站应用的规模不断扩大&#xff0c;常规的垂直应用架构已无法应对&#xff0c;分布式服务架构以及流动计算架构势在必行&#xff0c;Dubbo是一个分布式服务框架&#xff0c;在这种情况下诞生的。现在核心业务抽取出来&#xff0c;作为独立的服务&…

孤掌难鸣-------堵水眼

序言: 一口水平井&#xff0c;井斜已经52度&#xff0c;方位在水平井的连线方向上。此段为增斜段&#xff0c;多次钻具组合的调整就为了正钻轨迹符合设计轨迹。然而在更换钻具组合下到底后&#xff0c;出现了两趟钻“堵水眼”的现象&#xff0c;第一次运气好顶开&#xff0c;而…

技术分享 | 一条神奇的曲线——贝塞尔曲线在前端的应用

源宝导读&#xff1a;在前端的开发中我们经常会遇到利用贝塞尔曲线帮助我们完成前端的动画和图形绘制&#xff0c;但是对其中的一些参数配置是一头雾水。本文将从贝塞尔曲线的原理讲起&#xff0c;由浅入深剖析一阶到多阶贝塞尔的实现原理&#xff0c;最后从三个方向来介绍它的…

女生来大姨妈该怎么哄她?

1 这捞人速度&#xff01;▼2 老师&#xff1a;我怀疑你在内涵我&#xff01;&#xff1f;&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼3 就很出戏&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼4 分手到底有多痛苦&#xff1f;▼5 家长会上看到的纸…

OAuth 2.1 的进化之路

背景2010年, OAuth 授权规范 1.0 (rfc 5849) 版本发布, 2年后, 更简单易用的 OAuth 2.0 规范发布&#xff08;rfc 6749&#xff09;, 这也是大家最熟悉并且在互联网上使用最广泛的版本, 在2012年的时候, iPhone 5 是全新的, 微软最新的浏览器还是 IE9, 单页面应用在当时还被称作…

中科院超牛的物理学家,摇滚界无人不知的“李白”,你一定听过他的歌!

全世界只有3.14 % 的人关注了爆炸吧知识一个热爱音乐的科研工作者最近&#xff0c;有不少模友在后台问&#xff0c;如何如何去平衡好学习/工作和兴趣爱好之间的关系&#xff1f;很多人会说这么简单的问题&#xff0c;为什么还要问&#xff1f;其实并不简单&#xff0c;在现实生…

Nginx源码安装及应用

一&#xff1a;Nginx简介&#xff1a; Nginx ("engine x") 是一个高性能的HTTP和反向代理服务器。在高连接并发的情况下&#xff0c;Nginx是Apache服务器不错的替代品。 Nginx作为负载均衡服务器&#xff1a;Nginx 既可以在内部直接支持Rails和PHP 程序对外进行服务&…

宝藏好物gRPCurl

gRPCurl简介gRPCurl[1]是一个与gRPC服务器交互的命令行工具&#xff0c;可认为是gRPC的curl工具。gRPCurl用于从命令行调用gRPC服务器支持的RPC方法&#xff0c;gRPC使用二进制编码(protobuf), 不能利用常规的curl工具(早期的curl版本还不支持HTTP/2)。1. gRPCurl工具接受json编…