博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
WPF数字滚动效果
阅读量:7108 次
发布时间:2019-06-28

本文共 8875 字,大约阅读时间需要 29 分钟。

和WPF数字滚动抽奖有区别,WPF数字滚动抽奖是随机的,而这里是确定的。

为了系统演示,这个效果通宵加班写了整整6个小时,中间就上了次厕所。

 

代码:

RollingNumberItemCtrl.xaml代码:

View Code

RollingNumberItemCtrl.xaml.cs代码:

using System;using System.Collections.Generic;using System.ComponentModel;using System.Linq;using System.Text;using System.Windows;using System.Windows.Controls;using System.Windows.Data;using System.Windows.Documents;using System.Windows.Input;using System.Windows.Media;using System.Windows.Media.Animation;using System.Windows.Media.Imaging;using System.Windows.Navigation;using System.Windows.Shapes;namespace SunCreate.Common.Controls{    ///     /// NumCtrl.xaml 的交互逻辑    ///     public partial class RollingNumberItemCtrl : INotifyPropertyChanged    {        private Thickness _MarginTop = new Thickness(0, 0, 0, 0);        ///         /// Margin        ///         public Thickness MarginTop        {            get { return _MarginTop; }            set            {                _MarginTop = value;                OnPropertyChanged("MarginTop");            }        }        private double _Num;        ///         /// 数字        ///         public double Num        {            get { return _Num; }            set            {                var ease = new ExponentialEase()                {                    EasingMode = EasingMode.EaseOut,                };                ThicknessAnimation animation = new ThicknessAnimation();                animation.EasingFunction = ease;                animation.From = new Thickness(0, 0 - _Num * Height, 0, 0);                double top1 = MarginTop.Top;                double d = 0 - value * Height;                if (value < _Num)                {                    d = 0 - (value + 10) * Height;                }                _Num = value;                OnPropertyChanged("Num");                MarginTop = new Thickness(0, d, 0, 0);                double top2 = MarginTop.Top;                animation.To = MarginTop;                //animation.Duration = TimeSpan.FromMilliseconds((top1 - top2) * 10);                if (top1 != top2)                {                    animation.Duration = TimeSpan.FromMilliseconds(1500);                    this.stackPanel.BeginAnimation(StackPanel.MarginProperty, animation);                }                MarginTop = new Thickness(0, 0 - value * Height, 0, 0);            }        }        public RollingNumberItemCtrl()        {            InitializeComponent();            this.DataContext = this;        }        #region INotifyPropertyChanged接口        public event PropertyChangedEventHandler PropertyChanged;        protected void OnPropertyChanged(string name)        {            if (PropertyChanged != null)            {                PropertyChanged(this, new PropertyChangedEventArgs(name));            }        }        #endregion    }}
View Code

RollingNumberCtrl.xaml代码:

View Code

RollingNumberCtrl.xaml.cs代码:

using System;using System.Collections.Generic;using System.Collections.ObjectModel;using System.ComponentModel;using System.Linq;using System.Text;using System.Windows;using System.Windows.Controls;using System.Windows.Data;using System.Windows.Documents;using System.Windows.Input;using System.Windows.Media;using System.Windows.Media.Imaging;using System.Windows.Navigation;using System.Windows.Shapes;namespace SunCreate.Common.Controls{    ///     /// MyTextBlock.xaml 的交互逻辑    ///     public partial class RollingNumberCtrl : INotifyPropertyChanged    {        private bool _firstLoaded = true;        public double ItemHeight        {            get { return (double)this.GetValue(RollingNumberCtrl.ItemHeightProperty); }            set            { this.SetValue(RollingNumberCtrl.ItemHeightProperty, value); }        }        private static DependencyProperty ItemHeightProperty = DependencyProperty.Register("ItemHeight", typeof(double), typeof(RollingNumberCtrl));        public string NumStr        {            get { return (string)this.GetValue(RollingNumberCtrl.NumStrProperty); }            set            { this.SetValue(RollingNumberCtrl.NumStrProperty, value); }        }        private static DependencyProperty NumStrProperty = DependencyProperty.Register("NumStr", typeof(string), typeof(RollingNumberCtrl), new PropertyMetadata(null, new PropertyChangedCallback(NumStrChanged)));        private static void NumStrChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)        {            (sender as RollingNumberCtrl).UpdateNumStr((sender as RollingNumberCtrl).NumStr);        }        private void UpdateNumStr(string numStr)        {            Text = numStr;        }        private string _Text;        ///         /// 文本        ///         public string Text        {            get { return _Text; }            set            {                _Text = value;                OnPropertyChanged("Text");                if (!_firstLoaded)                {                    RollingNumberItemCtrl[] numArr = new RollingNumberItemCtrl[stackPanel.Children.Count];                    int index = 1;                    foreach (RollingNumberItemCtrl num in stackPanel.Children)                    {                        numArr[numArr.Length - index++] = num;                    }                    if (_Text != null)                    {                        int i = 0;                        foreach (char c in _Text.Reverse())                        {                            double d = Convert.ToInt32(c - 48); ;                            numArr[i++].Num = d;                        }                        for (int k = 0; k < i; k++)                        {                            numArr[k].Visibility = Visibility.Visible;                        }                        for (int k = i; k < numArr.Length; k++)                        {                            numArr[k].Visibility = Visibility.Collapsed;                        }                    }                }            }        }        public RollingNumberCtrl()        {            InitializeComponent();        }        #region INotifyPropertyChanged接口        public event PropertyChangedEventHandler PropertyChanged;        protected void OnPropertyChanged(string name)        {            if (PropertyChanged != null)            {                PropertyChanged(this, new PropertyChangedEventArgs(name));            }        }        #endregion        private void UserControl_Loaded(object sender, RoutedEventArgs e)        {            if (_firstLoaded) _firstLoaded = false;            foreach (RollingNumberItemCtrl num in stackPanel.Children)            {                num.Height = this.ItemHeight;                num.Width = this.ItemHeight * 0.6;                num.FontWeight = this.FontWeight;            }            Text = NumStr;        }    }}
View Code

如何使用:

View Code

 

效果图:

 

转载于:https://www.cnblogs.com/s0611163/p/10640275.html

你可能感兴趣的文章
代码上线的shell脚本
查看>>
5分钟了解swagger
查看>>
Unity3dResources加载预制体与Sprite精灵图片
查看>>
HTTPS中证书链不完整的解决方案
查看>>
Quick BI升级到3.0以上版本后,究竟发生了哪些变化?
查看>>
实时计算Flink > 独享模式 > Batch(试用) > 创建结果表 —— 创建HDFS结果表
查看>>
记一次MongoDB故障排查的过程
查看>>
春运抢票经验
查看>>
Nginx 日志处理、awstats分析(学习笔记十三)
查看>>
Python3基础语法你学会了么
查看>>
第一篇博客
查看>>
玩转K8S之如何访问业务应用(Traefik-ingress篇)
查看>>
装修红宝书
查看>>
实时同步数据-数据库实时同步软件-mysql实时同步SyncNavigator
查看>>
swiper 划不动问题
查看>>
Inferno 7.1.12 发布,类 React 的高性能用户界面库
查看>>
MP实战系列(十二)之封装方法详解(续二)
查看>>
mysql必知必会2
查看>>
“想学吗”个人知识管理工具 6.0.5 发布,支持更多平台
查看>>
nginx作为web服务器一个重要的功能就是反向代理
查看>>