WPF實(shí)現(xiàn)倒計(jì)時(shí)轉(zhuǎn)場(chǎng)動(dòng)畫效果
代碼如下
一、創(chuàng)建 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; ????????????????????????else ????????????????????????????solidColor?=?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; ????????????} ????????} ????} }
效果預(yù)覽
到此這篇關(guān)于WPF實(shí)現(xiàn)倒計(jì)時(shí)轉(zhuǎn)場(chǎng)動(dòng)畫效果的文章就介紹到這了,更多相關(guān)WPF倒計(jì)時(shí)動(dòng)畫內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#中結(jié)構(gòu)體定義并轉(zhuǎn)換字節(jié)數(shù)組詳解
在寫C#TCP通信程序時(shí),發(fā)送數(shù)據(jù)時(shí),只能發(fā)送byte數(shù)組,處理起來比較麻煩不說,如果是和VC6.0等寫的程序通信的話,很多的都是傳送結(jié)構(gòu)體,在VC6.0中可以很方便的把一個(gè)char[]數(shù)組轉(zhuǎn)換為一個(gè)結(jié)構(gòu)體,而在C#卻不能直接把byte數(shù)組轉(zhuǎn)換為結(jié)構(gòu)體,要在C#中發(fā)送結(jié)構(gòu)體,應(yīng)該怎么做呢?2017-11-11C#數(shù)據(jù)類型轉(zhuǎn)換(顯式轉(zhuǎn)型、隱式轉(zhuǎn)型、強(qiáng)制轉(zhuǎn)型)
本文詳細(xì)講解了C#數(shù)據(jù)類型轉(zhuǎn)換(顯式轉(zhuǎn)型、隱式轉(zhuǎn)型、強(qiáng)制轉(zhuǎn)型),文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-01-01C#學(xué)習(xí)進(jìn)階Hello World的17種寫法代碼分享
本文針對(duì)不同階段、不同程度的C#學(xué)習(xí)者,介紹了C# Hello World的17種不同寫法,C# Hello World寫法入門、C# Hello World寫法進(jìn)階、C# Hello World的特別寫法三種角度進(jìn)行推進(jìn)2013-12-12C#語(yǔ)句先后順序?qū)Τ绦虻慕Y(jié)果有影響嗎
有朋友問我,C#中C#語(yǔ)句先后順序影響程序的結(jié)果嗎?告訴大家,答案是肯定的,絕對(duì)影響程序的結(jié)果,所以在程序中一定要注意C#語(yǔ)句的順序2015-10-10C#動(dòng)態(tài)加載dll擴(kuò)展系統(tǒng)功能的方法
這篇文章主要介紹了C#動(dòng)態(tài)加載dll擴(kuò)展系統(tǒng)功能的方法,涉及C#動(dòng)態(tài)加載dll擴(kuò)展的相關(guān)技巧,需要的朋友可以參考下2015-04-04