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

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

代码:

RollingNumberItemCtrl.xaml代码:

<UserControl x:Class="SunCreate.Common.Controls.RollingNumberCtrl"
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"
mc:Ignorable="d"
xmlns:local="clr-namespace:SunCreate.Common.Controls"
d:DesignHeight="30" d:DesignWidth="300" Loaded="UserControl_Loaded">
<Grid>
<StackPanel x:Name="stackPanel" Orientation="Horizontal" >
<local:RollingNumberItemCtrl Height="30" Width="18" Num="0" Visibility="Collapsed"></local:RollingNumberItemCtrl>
<local:RollingNumberItemCtrl Height="30" Width="18" Num="0" Visibility="Collapsed"></local:RollingNumberItemCtrl>
<Border x:Name="separator2" Height="30" Width="18" Visibility="Collapsed">
<TextBlock FontSize="30" Text="," VerticalAlignment="Bottom" HorizontalAlignment="Center" ></TextBlock>
</Border>
<local:RollingNumberItemCtrl Height="30" Width="18" Num="0" Visibility="Collapsed"></local:RollingNumberItemCtrl>
<local:RollingNumberItemCtrl Height="30" Width="18" Num="0" Visibility="Collapsed"></local:RollingNumberItemCtrl>
<local:RollingNumberItemCtrl Height="30" Width="18" Num="0" Visibility="Collapsed"></local:RollingNumberItemCtrl>
<local:RollingNumberItemCtrl Height="30" Width="18" Num="0" Visibility="Collapsed"></local:RollingNumberItemCtrl>
<Border x:Name="separator1" Height="30" Width="18" Visibility="Collapsed">
<TextBlock FontSize="30" Text="," VerticalAlignment="Bottom" HorizontalAlignment="Center" ></TextBlock>
</Border>
<local:RollingNumberItemCtrl Height="30" Width="18" Num="0" Visibility="Collapsed"></local:RollingNumberItemCtrl>
<local:RollingNumberItemCtrl Height="30" Width="18" Num="0" Visibility="Collapsed"></local:RollingNumberItemCtrl>
<local:RollingNumberItemCtrl Height="30" Width="18" Num="0" Visibility="Collapsed"></local:RollingNumberItemCtrl>
<local:RollingNumberItemCtrl Height="30" Width="18" Num="0"></local:RollingNumberItemCtrl>
</StackPanel>
</Grid>
</UserControl>

RollingNumberItemCtrl.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
{
/// <summary>
/// MyTextBlock.xaml 的交互逻辑
/// </summary>
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))); public bool ShowSeparator
{
get { return (bool)this.GetValue(RollingNumberCtrl.ShowSeparatorProperty); }
set
{ this.SetValue(RollingNumberCtrl.ShowSeparatorProperty, value); }
}
private static DependencyProperty ShowSeparatorProperty = DependencyProperty.Register("ShowSeparator", typeof(bool), typeof(RollingNumberCtrl)); private static void NumStrChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
{
(sender as RollingNumberCtrl).UpdateNumStr((sender as RollingNumberCtrl).NumStr);
} private void UpdateNumStr(string numStr)
{
Text = numStr;
if (numStr.Length > && ShowSeparator) separator1.Visibility = Visibility.Visible;
if (numStr.Length > && ShowSeparator) separator2.Visibility = Visibility.Visible;
} private string _Text;
/// <summary>
/// 文本
/// </summary>
public string Text
{
get { return _Text; }
set
{
_Text = value;
OnPropertyChanged("Text"); if (!_firstLoaded)
{
List<RollingNumberItemCtrl> numCtrlList = new List<RollingNumberItemCtrl>();
foreach (FrameworkElement element in stackPanel.Children)
{
if (element is RollingNumberItemCtrl)
{
RollingNumberItemCtrl num = element as RollingNumberItemCtrl;
numCtrlList.Add(num);
}
} RollingNumberItemCtrl[] numArr = new RollingNumberItemCtrl[numCtrlList.Count];
int index = ;
foreach (RollingNumberItemCtrl num in numCtrlList)
{
numArr[numArr.Length - index++] = num;
} if (_Text != null)
{
int i = ;
foreach (char c in _Text.Reverse())
{
double d = Convert.ToInt32(c - ); ; numArr[i++].Num = d;
}
for (int k = ; 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 (FrameworkElement element in stackPanel.Children)
{
element.Height = this.ItemHeight;
element.Width = this.ItemHeight * 0.6; if (element is RollingNumberItemCtrl)
{
RollingNumberItemCtrl num = element as RollingNumberItemCtrl;
num.FontWeight = this.FontWeight;
} if (element is Border)
{
Border border = element as Border;
TextBlock txt = border.Child as TextBlock;
txt.FontSize = this.ItemHeight;
txt.FontWeight = this.FontWeight;
}
} Text = NumStr;
} }
}

RollingNumberCtrl.xaml代码:

<UserControl x:Class="SunCreate.Common.Controls.RollingNumberCtrl"
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"
mc:Ignorable="d"
xmlns:local="clr-namespace:SunCreate.Common.Controls"
d:DesignHeight="30" d:DesignWidth="300" Loaded="UserControl_Loaded">
<Grid>
<StackPanel x:Name="stackPanel" Orientation="Horizontal" >
<local:RollingNumberItemCtrl Height="30" Width="18" Num="0" Visibility="Collapsed"></local:RollingNumberItemCtrl>
<local:RollingNumberItemCtrl Height="30" Width="18" Num="0" Visibility="Collapsed"></local:RollingNumberItemCtrl>
<local:RollingNumberItemCtrl Height="30" Width="18" Num="0" Visibility="Collapsed"></local:RollingNumberItemCtrl>
<local:RollingNumberItemCtrl Height="30" Width="18" Num="0" Visibility="Collapsed"></local:RollingNumberItemCtrl>
<local:RollingNumberItemCtrl Height="30" Width="18" Num="0" Visibility="Collapsed"></local:RollingNumberItemCtrl>
<local:RollingNumberItemCtrl Height="30" Width="18" Num="0" Visibility="Collapsed"></local:RollingNumberItemCtrl>
<local:RollingNumberItemCtrl Height="30" Width="18" Num="0" Visibility="Collapsed"></local:RollingNumberItemCtrl>
<local:RollingNumberItemCtrl Height="30" Width="18" Num="0" Visibility="Collapsed"></local:RollingNumberItemCtrl>
<local:RollingNumberItemCtrl Height="30" Width="18" Num="0"></local:RollingNumberItemCtrl>
</StackPanel>
</Grid>
</UserControl>

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
{
/// <summary>
/// MyTextBlock.xaml 的交互逻辑
/// </summary>
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;
/// <summary>
/// 文本
/// </summary>
public string Text
{
get { return _Text; }
set
{
_Text = value;
OnPropertyChanged("Text"); if (!_firstLoaded)
{
RollingNumberItemCtrl[] numArr = new RollingNumberItemCtrl[stackPanel.Children.Count];
int index = ;
foreach (RollingNumberItemCtrl num in stackPanel.Children)
{
numArr[numArr.Length - index++] = num;
} if (_Text != null)
{
int i = ;
foreach (char c in _Text.Reverse())
{
double d = Convert.ToInt32(c - ); ; numArr[i++].Num = d;
}
for (int k = ; 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;
} }
}

如何使用:

<controls:RollingNumberCtrl Margin="0 2 0 0" ItemHeight="20" NumStr="{Binding CarInOut}" Foreground="#fff" FontSize="20" FontWeight="Bold" ></controls:RollingNumberCtrl>

效果图:

WPF数字滚动效果的更多相关文章

  1. 采用cocos2d-x lua 制作数字滚动效果样例

    require "Cocos2d"require "Cocos2dConstants"local testscene = class("testsce ...

  2. Wpf自动滚动效果

    一.思路 1.使用ScrollView的Scroll.ScrollToVerticalOffset(offset)方法进行滚动 2.ScrollView中放置2个ListView,第一个滚动出边界后, ...

  3. WPF 文本滚动效果 渐变效果

    <DockPanel> <StackPanel DockPanel.Dock="Bottom" VerticalAlignment="Bottom&qu ...

  4. 用jQuery实现数字滚动效果

    html 部分 <div class="js-box box"></div> css 部分 .statistic .box{ display: inline ...

  5. ajax异步请求获取数据,实现滚动数字的效果。

    BackgroundPositionAnimate.js下载 需要导入的js: <script type="text/javascript" src="js/jqu ...

  6. Vue.js大屏数字滚动翻转效果

    ================================ 大屏数字滚动翻转效果来源于最近工作中element后台管理页面一张大屏的UI图,该UI图上有一个模块需要有数字往上翻动的效果,以下是最 ...

  7. 让数字变化炫酷起来,数字滚动Text组件[Unity]

    让数字滚动起来 上周我的策划又提了样需求,当玩家评分发生变动时,屏幕出现人物评分浮层UI,播放评分数字滚动动画.这类数字滚动需求非常常见,我就按一般思路,将startvalue与endvalue每隔一 ...

  8. jQuery数字滚动(模拟网站人气、访问量递增)原创

    插件描述:实现数字上下滚动,模拟网站人气.访问量递增的动画效果,兼容性如下: 使用方法 $(el).runNum(val,params);   参数详解 val:数值型(默认70225800): pa ...

  9. JS图片自动或者手动滚动效果(支持left或者up)

    JS图片自动或者手动滚动效果(支持left或者up) JS图片自动或者手动滚动效果 在谈组件之前 来谈谈今天遇到搞笑的事情,今天上午接到一个杭州电话 0571-28001187 即说是杭州人民法院的 ...

随机推荐

  1. Centos nginx安装

    1.下载nginx http://nginx.org/en/download.html 2.上传到服务器上,并解压: rz 后选择上传的文件 tar -zxvf /fish/download/ngin ...

  2. PHP/TP5 接口设计中异常处理

    PHP提供 Exception 类来处理异常 new Exception('错误信息(默认为空)','错误代码(默认0)','异常链中前一个异常') 然后可以通过 e -> getMessage ...

  3. pyqt5.0 GraphicsView框架

    场景(The Scene) QGraphicsScene提供图形视图场景.该场景具有以下职责: 提供用于管理大量图元的快速界面(锅) 将事件传播到每个图元(把螃蟹烧熟了) 管理图元状态,例如选择和焦点 ...

  4. ElasicSearch(1)

    ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口.Elasticsearch是用Java开发的,并作为Apach ...

  5. python-imaging-tk : Depends: python-imaging (= 1.1.7-4ubuntu0.12.04.3) but 3.1.2-0ubuntu1.1 is to be installed E: Unable to corre

    最近,将电脑主机升级到ubuntu16.04,但是需要用到 python-imaging-tk,先是报错: import PIL.ImageTk as ImageTkImportError: No m ...

  6. java简单的文件读写工具类

    import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.BufferedRead ...

  7. day34 并发编程之生产者消费者模型 队列

    1.守护进程(了解) """ 守护进程 表示 一个进程b 守护另一个进程a 当被守护的进程a结束后 那么b也跟着结束了 就像 皇帝驾崩 妃子殉葬 应用场景 之所以开启子进 ...

  8. mybatis中查询使用#{}和${}的区别

    ${}中的变量什么值,就会简单的替代变量,不会做处理 比如delete * from tb_label where name=${labelname} 如果labelname的值是 something ...

  9. 微信小程序记账本进度一

    一,1.注册微信公众号 2.点击“立即注册”后,点击“”小程序“” 3.填写邮箱等信息.完成并激活.

  10. react项目的ant-design-mobile的使用

    现在测试一下ant-design-mobile的使用,引用一个Button 没有样式 这个问题是没有引入样式 解决方法有两种 这种方法自己弄不出来,然后用另外一种方法 引入样式: import 'an ...