WPF 实现简单的跑马灯
本文用WPF的动画实现一个简单的跑马灯
xmal:
<Window x:Class="wpfstatusBar.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:wpfstatusBar"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="200">
<Grid >
<Canvas Name="canva1" ClipToBounds="True" Background="Aquamarine" >
<StackPanel Name="sp1" Background="Aqua" Orientation="Horizontal">
<Label Name="lab1" Content="1111111111111111111111111"/>
<Label Name="lab2" Content="2222222222222222222222222"/>
<Label Name="lab3" Content="3333333333333333333333333"/>
<Label Name="lab4" Content="1111111111111111111111111"/>
</StackPanel>
</Canvas>
</Grid>
</Window>
下面是一个最简单的例子,就让label动起来:
public MainWindow()
{
InitializeComponent();
storyboard_imgs = new Storyboard();
daukf_img1 = new DoubleAnimationUsingKeyFrames();
Storyboard.SetTarget(daukf_img1, sp1);
Storyboard.SetTargetProperty(daukf_img1, new PropertyPath("(Canvas.Left)"));
LinearDoubleKeyFrame k1_img1 = new LinearDoubleKeyFrame(0, KeyTime.FromTimeSpan(new TimeSpan(0, 0, 0)));
LinearDoubleKeyFrame k2_img1 = new LinearDoubleKeyFrame(-600, KeyTime.FromTimeSpan(new TimeSpan(0, 0, 3)));
daukf_img1.KeyFrames.Add(k1_img1);
daukf_img1.KeyFrames.Add(k2_img1);
storyboard_imgs.Children.Add(daukf_img1);
storyboard_imgs.Begin();
}
然后进入正题,利用定时器实现一个简单的循环滚动3个Label的跑马灯
关键点在于第三个lab滚动的时候怎么衔接第一个lab,其实很简单,就是多new了一个和第一个lab一样的lab放在最后,
在滚动第四个lab后,利用动画开始后会瞬间将lab定位到初始位置的特性即可完成,当然如果硬要只new三个lab也行,
通过add,remove这样的操作完成,但是会比较复杂,本文应该是实现该功能最简单的算法了!xmal和上面例子一样,cs代码如下:
public partial class MainWindow : Window
{
DispatcherTimer _timer = new DispatcherTimer(); //UI定时器
Storyboard storyboard_imgs = null;
DoubleAnimationUsingKeyFrames daukf_img1 =null;
public MainWindow()
{
InitializeComponent();
_timer.Interval = new TimeSpan(0, 0, 0, 2);
_timer.Tick += TimerElapsed;
storyboard_imgs = new Storyboard();
daukf_img1 = new DoubleAnimationUsingKeyFrames();
Storyboard.SetTarget(daukf_img1, sp1);
Storyboard.SetTargetProperty(daukf_img1, new PropertyPath("(Canvas.Left)"));
_timer.Start();
}
int index = 0;
void TimerElapsed(object o,EventArgs e)
{
double start_left = 0;
double end_left = 0;
index++;
if(index%3==1)
{
end_left = -lab1.ActualWidth;
}
else if(index%3==2)
{
start_left= -lab1.ActualWidth;
end_left = -lab1.ActualWidth-lab2.ActualWidth;
}
else if(index%3==0)
{
start_left = -lab1.ActualWidth - lab2.ActualWidth;
end_left = -lab1.ActualWidth - lab2.ActualWidth-lab3.ActualWidth;
}
daukf_img1.KeyFrames.Clear();
storyboard_imgs.Children.Clear();
LinearDoubleKeyFrame k1_img1 = new LinearDoubleKeyFrame(start_left, KeyTime.FromTimeSpan(new TimeSpan(0, 0, 0)));
LinearDoubleKeyFrame k2_img1 = new LinearDoubleKeyFrame(end_left, KeyTime.FromTimeSpan(new TimeSpan(0, 0, 1)));
daukf_img1.KeyFrames.Add(k1_img1);
daukf_img1.KeyFrames.Add(k2_img1);
storyboard_imgs.Children.Add(daukf_img1);
storyboard_imgs.Begin();
}
}
WPF 实现简单的跑马灯的更多相关文章
- Android:TextView文字跑马灯的效果实现
解决TextView文字显示不全的问题. 简单设置跑马灯的效果: <TextView android:id="@+id/textView" android:layout_wi ...
- Unity3D 文字滚动跑马灯效果
需求 在日常游戏中,文字滚动效果是比较常用的.例如日常游戏顶部的新闻公告,聊天系统的文字滚动,都属于这个范围. 思路 由于使用的地方比较广泛,所以希望能够尽量独立的游戏之外,能够做到随处使用的功能.N ...
- javascript 跑马灯
1.看了写跑马灯的教程案例,隔了段时间自己写了一个简单的跑马灯.将过程中遇到的问题特此记录下来 代码如下: <!DOCTYPE html> <html> <head> ...
- 纯css3跑马灯demo
我们写跑马灯一般都是用js控制定时器不断循环产生,但是定时器消耗比较大,特别是程序中很多用到定时器的时候,感觉有的时候比较卡.但是css3样式一般不会.这里主要的思路就是用css3代替js定时器实现一 ...
- 【跑马灯】纯css3跑马灯demo
我们写跑马灯一般都是用js控制定时器不断循环产生,但是定时器消耗比较大,特别是程序中很多用到定时器的时候,感觉有的时候比较卡.但是css3样式一般不会.这里主要的思路就是用css3代替js定时器实现一 ...
- Arduino 跑马灯
参考: 1. https://blog.csdn.net/hunhun1122/article/details/70254606 2. http://www.51hei.com/arduino/392 ...
- js+css简单效果(幕布,跑马灯)
2.js普通的盒子,css的优先级 css的优先级 !important >>>>> style 行内样式 >>>>> #id选择器 # ...
- TextView中实现跑马灯的最简单方法
几行代码实现跑马灯效果,效果如下: 因为很简单,所以就直接贴代码喽 <TextView android:id="@+id/item1_title_message" andro ...
- WPF 实现跑马灯效果的Label控件,数据绑定方式实现
原文:WPF 实现跑马灯效果的Label控件,数据绑定方式实现 项目中需要使用数据绑定的方式实现跑马灯效果的Label,故重构了Label控件:具体代码如下 using System; using S ...
随机推荐
- Jmeter 录制脚本【转】
Jmeter 录制脚本[转] Jmeter中有2种方法可以录制脚本. 不过我个人非常不推荐录制脚本,录制的脚本混乱,需要再次加工才能使用. 像我这么精通HTTP协议的人. 一直都是使用Fiddler ...
- Java事件监听机制与观察者设计模式
一. Java事件监听机制 1. 事件监听三要素: 事件源,事件对象,事件监听器 2. 三要素之间的关系:事件源注册事件监听器后,当事件源上发生某个动作时,事件源就会调用事件监听的一个方法,并将事件对 ...
- sqlite3-入门日记4-实现C++类封装
一.前言: 今天试了下如何用C++类实现接口封装,感觉蛮好 .用于封装的类主要有两个,SQLiteStatement类和SQLiteWrapper类,是一个老外写的.我看了下源码,主要是对C接口进 ...
- c++ STL使用
STL标准模板库,提供一些类似java集合类的数据结构容器.比如eque.list.vector.map 等.还提供一些支持这些容器的算法和遍历容器的迭代器. 使用方法 #include <io ...
- Java—重写与重载的区别
1.重写(Override) 子类继承了父类原有的方法,但有时子类并不想原封不动的继承父类中的某个方法,所以在方法名,参数列表,返回类型(除了子类中方法的返回值是父类中方法返回值的子类时)都相同的情况 ...
- Python学习day44-数据库(单表及多表查询)
figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...
- Teigha克隆db的blockTableRecord里面的一个实体
std::vector<OdDbEntityPtr> entities; OdDbBlockTableRecordPtr blkTblRcd = blockId.openObject(); ...
- Java实现数字大写转换
需求如下:用json读取后台工时信息,比如23.5小时,需要通过编码将其转换为贰拾叁点伍 比如23.23之前有对Stringl类型强转为Double在转为整型,发生了精度丢失,后来想想对小数点进行分割 ...
- E: 无法获得锁 /var/lib/apt/lists/lock - open (11: 资源暂时不可用) E: 无法对目录 /var/lib/apt/lists/ 加锁 问题解决方法
使用Ubuntu16.04安装软件执行apt-get update时出现如下错误: E: 无法获得锁 /var/lib/apt/lists/lock - open (11: 资源暂时不可用) E: 无 ...
- Vue 仿QQ左滑删除功能(非原创)
非原创,摘选来源:http://www.jb51.net/article/136221.htm. 废话不多说,相当实用,先记录. Html代码: <div class="contain ...