WPF 实现倒计时转场动画~

元旦元旦团团圆圆、WPF开发者在此真诚的祝愿开发者们在新的一年里心想事成、万事如意!33de38993d2be92283074c48a024c250.png1eb5881be4f051df683ca3c04f0166c6.pngb7ace42864c75aff05890fe069f30c90.png

WPF开发者QQ群: 340500857

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

 yanjinhuawechat 或 W_Feng_aiQ 入群

 需备注WPF开发者 

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

01

代码如下

一、创建 CountdownTimer.xaml 继承ContentControl代码如下。

using System;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Media.Effects;namespace WPFDevelopers.Controls
{public enum CountdownTimerEffect{Default,MultiColor}public class CountdownTimer : ContentControl{private Storyboard storyboard;private const double seconds = 800;private double currentSeconds = seconds;private Grid myGrid;public int Number{get { return (int)GetValue(NumberProperty); }set { SetValue(NumberProperty, value); }}public static readonly DependencyProperty NumberProperty =DependencyProperty.Register("Number", typeof(int), typeof(CountdownTimer), new PropertyMetadata(3));/// <summary>/// 完成后回到开始/// </summary>public bool IsFinishStart{get { return (bool)GetValue(IsFinishStartProperty); }set { SetValue(IsFinishStartProperty, value); }}public static readonly DependencyProperty IsFinishStartProperty =DependencyProperty.Register("IsFinishStart", typeof(bool), typeof(CountdownTimer), new PropertyMetadata(false));public CountdownTimerEffect CountdownTimerEffect{get { return (CountdownTimerEffect)GetValue(CountdownTimerEffectProperty); }set { SetValue(CountdownTimerEffectProperty, value); }}public static readonly DependencyProperty CountdownTimerEffectProperty =DependencyProperty.Register("ExhibitionEnum", typeof(CountdownTimerEffect), typeof(CountdownTimer), new PropertyMetadata(CountdownTimerEffect.Default));public override void OnApplyTemplate(){base.OnApplyTemplate();NameScope.SetNameScope(this, new NameScope());if (FontSize == SystemFonts.CaptionFontSize)FontSize = 200;FontFamily = DrawingContextHelper.FontFamily;storyboard = new Storyboard();myGrid = new Grid();myGrid.Name = "myGrid";myGrid.ToolTip = "MouseDown";myGrid.Background = new SolidColorBrush(Colors.White);var linearGradient = new LinearGradientBrush{GradientStops = new GradientStopCollection{new GradientStop{ Color = Colors.Red, Offset = 1 },new GradientStop{ Color = Colors.White, Offset = 1 },new GradientStop{ Color = Colors.White, Offset = .5 },new GradientStop{ Color = Colors.Red, Offset = .5 },new GradientStop{ Color = Colors.Red, Offset = 0 },new GradientStop{ Color = Colors.White, Offset = 0 },},StartPoint = new Point(0.5, 0),EndPoint = new Point(10, 10),SpreadMethod = GradientSpreadMethod.Reflect,MappingMode = BrushMappingMode.Absolute};SolidColorBrush solidColor;this.RegisterName(myGrid.Name, myGrid);var num = 0;for (int i = Number; i >= num; i--){var textBlock = new TextBlock();switch (CountdownTimerEffect){case CountdownTimerEffect.Default:if (i % 2 == 0)solidColor = Brushes.White;elsesolidColor = Brushes.Black;textBlock.Foreground = solidColor;break;case CountdownTimerEffect.MultiColor:textBlock.Foreground = linearGradient;break;}textBlock.Text = i.ToString();textBlock.Name = $"textBlock{i}";textBlock.FontSize = FontSize;textBlock.FontWeight = FontWeights.ExtraBold;textBlock.VerticalAlignment = VerticalAlignment.Center;textBlock.HorizontalAlignment = HorizontalAlignment.Center;textBlock.RenderTransformOrigin = new Point(.5, .5);textBlock.Effect = new DropShadowEffect{ShadowDepth = 2,RenderingBias = RenderingBias.Performance,Color = Colors.Red};if (!i.Equals(Number))textBlock.Opacity = 0;textBlock.RenderTransform = new ScaleTransform{ScaleX = 2,ScaleY = 2,};this.RegisterName(textBlock.Name, textBlock);TimeSpan beginTime = TimeSpan.Zero;if (storyboard.Children.Count > 0){beginTime = TimeSpan.FromMilliseconds(currentSeconds);currentSeconds += seconds;}var cubicEase = new CubicEase{EasingMode = EasingMode.EaseIn,};DoubleAnimation doubleAnimationScaleX = new DoubleAnimation();doubleAnimationScaleX.From = 2;doubleAnimationScaleX.To = 0;doubleAnimationScaleX.EasingFunction = cubicEase;Storyboard.SetTargetName(doubleAnimationScaleX, textBlock.Name);Storyboard.SetTargetProperty(doubleAnimationScaleX, new PropertyPath("(TextBlock.RenderTransform).(ScaleTransform.ScaleX)"));var doubleAnimationScaleY = new DoubleAnimation{From = 2,To = 0,EasingFunction = cubicEase};Storyboard.SetTargetName(doubleAnimationScaleY, textBlock.Name);Storyboard.SetTargetProperty(doubleAnimationScaleY, new PropertyPath("(TextBlock.RenderTransform).(ScaleTransform.ScaleY)"));doubleAnimationScaleX.BeginTime = beginTime;doubleAnimationScaleY.BeginTime = beginTime;doubleAnimationScaleX.Duration = TimeSpan.FromMilliseconds(seconds);doubleAnimationScaleY.Duration = TimeSpan.FromMilliseconds(seconds);if (!i.Equals(Number)){var doubleAnimationOpacity = new DoubleAnimation{Duration = TimeSpan.FromMilliseconds(0),BeginTime = beginTime,From = 0,To = 1};Storyboard.SetTargetName(doubleAnimationOpacity, textBlock.Name);Storyboard.SetTargetProperty(doubleAnimationOpacity, new PropertyPath(TextBlock.OpacityProperty));storyboard.Children.Add(doubleAnimationOpacity);}if (i % 2 == 0){var colorAnimation = new ColorAnimation{Duration = TimeSpan.FromMilliseconds(0),From = Colors.White,BeginTime = beginTime,To = Colors.Black};Storyboard.SetTargetName(colorAnimation, myGrid.Name);Storyboard.SetTargetProperty(colorAnimation, new PropertyPath("(Panel.Background).(SolidColorBrush.Color)"));storyboard.Children.Add(colorAnimation);}else{if (!i.Equals(Number)){var colorAnimation = new ColorAnimation{Duration = TimeSpan.FromMilliseconds(0),BeginTime = beginTime,From = Colors.Black,To = Colors.White};Storyboard.SetTargetName(colorAnimation, myGrid.Name);Storyboard.SetTargetProperty(colorAnimation, new PropertyPath("(Panel.Background).(SolidColorBrush.Color)"));storyboard.Children.Add(colorAnimation);}}storyboard.Children.Add(doubleAnimationScaleX);storyboard.Children.Add(doubleAnimationScaleY);myGrid.Children.Add(textBlock);}this.Content = myGrid;}protected override void OnMouseDown(MouseButtonEventArgs e){base.OnMouseDown(e);if (storyboard != null && storyboard.Children.Count > 0){storyboard.Completed += (s, y) =>{myGrid.Background = new SolidColorBrush(Colors.White);if (IsFinishStart){var scaleTransform = new ScaleTransform{ScaleX = 2,ScaleY = 2};var tb = myGrid.Children.Cast<TextBlock>().First();tb.RenderTransform = scaleTransform;}};storyboard.Begin(this);}}}
}

二、CountdownTimerExample.xaml 代码如下

<UserControl x:Class="WPFDevelopers.Samples.ExampleViews.CountdownTimerExample"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:WPFDevelopers.Samples.ExampleViews"xmlns:wpfdev="https://github.com/yanjinhuagood/WPFDevelopers"mc:Ignorable="d" d:DesignHeight="450" d:DesignWidth="800"><Grid Margin="10" Grid.Row="1"><Grid.RowDefinitions><RowDefinition Height="Auto"/><RowDefinition Height="*"/></Grid.RowDefinitions><Border Margin="0,0,0,0" Background="{StaticResource WhiteSolidColorBrush}" CornerRadius="4,4,0,0" Effect="{StaticResource NormalShadowDepth}"><wpfdev:NavigateMenu TabStripPlacement="Top" SelectionChanged="NavigateMenu_SelectionChanged"><ListBoxItem Content="Default"/><ListBoxItem Content="MultiColor"/></wpfdev:NavigateMenu></Border><Border Grid.Row="1" Background="{StaticResource WhiteSolidColorBrush}" CornerRadius="0,0,4,4"Effect="{StaticResource NormalShadowDepth}"><Grid Margin="10"><wpfdev:CountdownTimer Number="3" x:Name="CountdownTimer1"/><UniformGrid Columns="4" Visibility="Collapsed" x:Name="CountdownTimerGroup"><wpfdev:CountdownTimer Number="9" CountdownTimerEffect="MultiColor" FontSize="150" IsFinishStart="True"/><wpfdev:CountdownTimer Number="5" CountdownTimerEffect="MultiColor" FontSize="150" IsFinishStart="True"/><wpfdev:CountdownTimer Number="2" CountdownTimerEffect="MultiColor" FontSize="150" IsFinishStart="True"/><wpfdev:CountdownTimer Number="7" CountdownTimerEffect="MultiColor" FontSize="150" IsFinishStart="True"/></UniformGrid></Grid></Border></Grid>
</UserControl>

三、CountdownTimerExample.xaml.cs 代码如下

using System.Windows;
using System.Windows.Controls;namespace WPFDevelopers.Samples.ExampleViews
{/// <summary>/// CountdownTimerExample.xaml 的交互逻辑/// </summary>public partial class CountdownTimerExample : UserControl{public CountdownTimerExample(){InitializeComponent();}private void NavigateMenu_SelectionChanged(object sender, SelectionChangedEventArgs e){var item = e.AddedItems[0] as ListBoxItem;if (item == null) return;switch (item.Content.ToString()){case "Default":if(CountdownTimer1.Visibility != Visibility.Visible){CountdownTimer1.Visibility = Visibility.Visible;CountdownTimerGroup.Visibility = Visibility.Collapsed;}break;case "MultiColor":if (CountdownTimerGroup.Visibility != Visibility.Visible){CountdownTimerGroup.Visibility = Visibility.Visible;CountdownTimer1.Visibility = Visibility.Collapsed;}break;}}}
}

02


效果预览

鸣谢素材提供者 - 贺龙

源码地址如下

Github:https://github.com/WPFDevelopersOrg

Gitee:https://gitee.com/WPFDevelopersOrg

WPF开发者QQ群: 340500857 

Github:https://github.com/WPFDevelopersOrg

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

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

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

d01f794b6f7af35d4004af33f5a3736f.png

扫一扫关注我们,

3d85fc7e18798c126758fabecf4981f0.gif

更多知识早知道!

020820ddf6df901c47edf98e78f95689.gif

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

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

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

相关文章

数字化架构

看过《EA企业架构》、《应用架构》和《IT与业务之间的鸿沟》文章的好多朋友给我发信息&#xff0c;能不能再写篇文章&#xff0c;各行各业的朋友都能看懂的、容易接受的&#xff0c;下面我将尽量尝试朝着这个方向努力写一篇数字化架构的文章&#xff0c;希望各界的朋友们都能有…

快速理解ASP.NET Core的认证与授权

ASP.NET Core的认证与授权已经不是什么新鲜事了&#xff0c;微软官方的文档对于如何在ASP.NET Core中实现认证与授权有着非常详细深入的介绍。但有时候在开发过程中&#xff0c;我们也往往会感觉无从下手&#xff0c;或者由于一开始没有进行认证授权机制的设计与规划&#xff0…

字符用_连接的是什么加密_防水连接器外壳与铜针表面涂层有什么用?

防水连接器外壳与铜针表面涂层会关系到产品的质量&#xff0c;毕竟材料选择方面&#xff0c;以及手工劳动方面都是需要把好关的&#xff0c;这样我们才能确保做出来了的产品送至用户身上是最好的。(凌科BD系列防水连接器铜针镀金效果)1、无氰偏碱亮铜&#xff1a;在铜合金材料防…

【27前端】base标签带有href属性会让chrome里的svg元素url失效

一个chrome的问题&#xff0c;但具体原因不明。 触发条件&#xff1a;chrome浏览器base标签里href属性有值的时候 触发问题&#xff1a;svg里面的元素如果有用url的滤镜和模糊&#xff0c;则会失效&#xff0c;在firefox里和IE10没有发现这个问题。 正常状态&#xff1a; 有bas…

强大的矩阵奇异值分解(SVD)及其应用

本文由LeftNotEasy发布于http://leftnoteasy.cnblogs.com, 本文可以被全部的转载或者部分使用&#xff0c;但请注明出处&#xff0c;如果有问题&#xff0c;请联系wheeleastgmail.com 前言&#xff1a; 上一次写了关于PCA与LDA的文章&#xff0c;PCA的实现一般有两种&#xff0…

已婚男人看见美女都这个眼神?

1 答应我&#xff1a;穿汉服晚上就别骑车了&#xff01;&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼2 真香定理从来不迟到▼3 这万圣节大餐吃得下去吗&#xff1f;&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼4 这...也灵活了吧&#xff1f;▼5 谁…

一个程序如何连接到外网_如何开发制作小程序?做一个电商带直播小程序

开发制作小程序可以让商家更方便地引流获客、增加线上订单。尤其是今年小程序直播大火&#xff0c;商家有了新的运营私域流量的利器&#xff0c;因此做一个电商带直播功能的小程序是很有用的。如何开发一个这样的小程序呢&#xff1f;流程如下&#xff1a;在「上线了」sxl.cn注…

推荐:Flowchart 一种通过文本方式描述的流程图

流程图&#xff08;Flowchart&#xff09;&#xff1a;使用图形表示算法的思路是一种极好的方法&#xff0c;因为千言万语不如一张图。流程图在汇编语言和早期的BASIC语言环境中得到应用。相关的还有一种PAD图&#xff0c;对PASCAL或C语言都极适用。Flowchart 是一种通过文本方…

thinkpad如何屏蔽bios更新 提示电池_有种血赚叫“二手”!3000搞定原价万元ThinkPad小黑本,真省钱...

你会为买种草已久笔记本剁手吗&#xff1f;在这不容易的2020年上半年&#xff0c;准备剁手买新电脑之前都得犹豫好几天吧&#xff0c;毕竟大家的钱包都收紧了。就连闲鱼上带有“年会奖品”、“刚买的老婆让退货”标签的东西都少了&#xff0c;各家厂商推出的新品也都在走极致性…

转载集合

本页链接均可单机跳转&#xff0c;网址过长的只给出超链接 背包九讲 pdfhttps://github.com/tianyicui/pack/blob/master/V2.pdf wzk线段树笔记http://wyfcyx.logdown.com/posts/201802-summary-data-structures-zkw-segment-tree-details 1 #include<cstdio>2 #include&…

c#屏幕录制(经典)(含源码和AForge.Video.FFMPEG.DLL)及填坑办法

一直觉得.net在多媒体处理方面渣得不行。最近需要做一个摄像头的程序&#xff0c;为了方便&#xff0c;用了AForge这个开源项目。AForge项目中有AForge.Video和AForge.Video. DirectShow这两个子项目&#xff0c;可以方便的调用摄像头。但是这两个项目最终只能取得视频帧&#…

drawable文件怎么添加图片_怎么给PDF文件添加书签

现如今我们使用的电子文档逐步都被PDF取代&#xff0c;虽然PDF有很多好处&#xff0c;但相较Word文档打开就能随意修改不同&#xff0c;PDF并不能直接编辑。比如有时我们要给PDF添加书签&#xff0c;这样可以快速找到要的页面&#xff0c;要怎么操作呢&#xff1f;一说到PDF的任…

通过Rancher Desktop在桌面上运行K8s

Rancher 发行的操作系统新选择&#xff1a;Rancher Desktop for Windows&#xff0c;它可以帮助你在Windows桌面上管理Kubernetes和容器。当然他当然会支持Linux&#xff0c;Mac的。准备工作在我们探索全新的Rancher Desktop之前&#xff0c;我们需要准备以下内容&#xff1a;1…

数学家排名,高斯第二牛顿第三?!看完第一的简历,他果然比牛顿还牛逼.........

如果让你给数学家排名&#xff0c;你会怎么排&#xff1f;谁排第一&#xff1f;高斯&#xff1f;阿基米德&#xff1f;还是其他哪位数学神仙&#xff1f;今天早上超模君发现&#xff0c;在国内某排行网站上&#xff0c;由网友投票选出来“世界十大数学家”里&#xff0c;名列前…

oc引导windows蓝屏_跟电脑蓝屏say no!【亲测有效】

​ 01专业解释电脑蓝屏&#xff0c;又叫蓝屏死机&#xff08;Blue Screen of Death&#xff0c;简称BSOD&#xff09;&#xff0c;是微软的 Windows 系列操作系统在无法从一个系统错误中恢复过来时&#xff0c;为保护电脑数据文件不被破坏而强制显示的屏幕图像。 看到了吧&…

hdu 1800 (map)

链接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid1800 Flying to the Mars Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 10830 Accepted Submission(s): 3472 Problem DescriptionIn the year 8…