iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >WPF实现倒计时转场动画效果
  • 785
分享到

WPF实现倒计时转场动画效果

WPF倒计时动画WPF倒计时WPF转场动画 2022-11-13 14:11:12 785人浏览 八月长安
摘要

代码如下 一、创建 CountdownTimer.xaml 继承ContentControl代码如下。 using System; using System.Linq; u

代码如下

一、创建 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;
            }
        }
    }
}

效果预览

到此这篇关于WPF实现倒计时转场动画效果的文章就介绍到这了,更多相关WPF倒计时动画内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: WPF实现倒计时转场动画效果

本文链接: https://www.lsjlt.com/news/171566.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • c语言怎么计算字符串长度
    在C语言中,可以使用内置的strlen()函数来计算字符串的长度。该函数位于string.h头文件中。以下是一个示例代码: #inc...
    99+
    2024-05-14
    c语言
  • c语言怎么判断三个数的大小
    可以通过比较三个数之间的大小关系来判断它们的大小。以下是一个示例代码: #include <stdio.h> int ...
    99+
    2024-05-14
    c语言
  • c++排序函数sort怎么使用
    在C++中,使用sort函数对容器中的元素进行排序,可以按照默认的升序排列,也可以自定义排序规则。 下面是一个简单的例子,对一个ve...
    99+
    2024-05-14
    c++
  • c++中string的compare函数怎么使用
    在C++中,可以使用string的compare函数来比较两个string对象的大小。该函数的原型如下: int compare(c...
    99+
    2024-05-14
    c++
  • c++中string的compare函数有什么用
    c++中string的compare函数用于比较两个字符串的大小关系。该函数返回一个整数值,表示两个字符串的比较结果。 具体来说,如...
    99+
    2024-05-14
    c++
  • c++中print函数的功能有哪些
    在C++中,通常使用std::cout来进行输出操作,而不是使用print函数。std::cout是C++标准库中的一个输出流对象,...
    99+
    2024-05-14
    c++
  • c语言数据结构怎么使用
    在C语言中,数据结构可以通过定义结构体来实现。以下是一些常见的数据结构的使用方法示例: 链表: #include <std...
    99+
    2024-05-14
    c语言
  • c++中print函数的用法是什么
    在C++中没有内置的print函数,但可以使用cout来输出内容到控制台。cout是C++标准库中的一个输出流对象,可以使用<...
    99+
    2024-05-14
    c++
  • c++中concept的用法是什么
    在C++20中,Concept是一种新的语言特性,用于定义类型要求和约束。Concept可以被用来约束函数模板、类模板和普通函数的参...
    99+
    2024-05-14
    c++
  • c++中concept的作用是什么
    在C++中,concept的作用是定义一种通用的约束,用于限制模板参数的类型范围。通过使用concept,可以在编译时对模板参数进行...
    99+
    2024-05-14
    c++
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作