以前经常来这里,但是很少写博客.最近在做silverlight 项目.前几天被一个 类似.netmarquee的循环滚动的功能憋了很长时间,现在和大家分享下.
2011-11-22 16:10
816 查看
下面我来说下集合滚动.在silverlght中没有html那样简单一句话就能实现循环滚动.既:marquee.
原始的例:<marquee onmouseover="stop()" onmouseout="start()" scrollamount="2" scrolldelay="1" height="22">
要循环的信息
</marquee>
我查阅了大量的文档和帮助,我确定自己写动画.在silverlight中没有像marquee那样简单的控件.只能自己拼:正面加上反面循环.
例子如下:因为这个是实际项目中的,下面的例子我简单的注释下,有写变量和注释写的不是很全.加上时间关系.如果有不明白的直接联系我,可查看相关文档.
或者直接来联系我:xuanrui.zhao@gmail.com
// 首先简单的描述下我做的这个功能:利用silverlight自带的动画标签:animation实现.在后台动态赋值两个集合,其实两个集合的值都是一样的就是
// 为了模拟marquee的循环.让其中一个集合在正面从上倒下,一个集合从下到上.实现滚动的假象.代码如下:
<Canvas x:Name="canMain" Background="Transparent" Cursor="Hand" >
<Canvas.Clip>
<!-- 定一个循环滚动的区域 -->
<RectangleGeometry x:Name="myRectangleGeometry" RadiusX="0" RadiusY="0" Rect="0,0, 340,50" />
</Canvas.Clip>
<Canvas.Triggers>
<EventTrigger RoutedEvent="Canvas.Loaded" >
<BeginStoryboard>
<!-- Canvas.Top :说明从下到上或者从上到下滚动 , RepeatBehavior="Forever" 为循环方式-->
<Storyboard x:Name="animation" Storyboard.TargetProperty="(Canvas.Top)" RepeatBehavior="Forever" >
<DoubleAnimation x:Name="daOne" Storyboard.TargetName="spScrollTwo" From="0" To="0" Duration="0:0:10" />
<DoubleAnimation x:Name="daTwo" Storyboard.TargetName="spScrollOne" From="0" To="0" Duration="0:0:10" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Canvas.Triggers>
<StackPanel x:Name="spScrollOne" Orientation="Vertical"></StackPanel> >//要滚动的集合一
<StackPanel x:Name="spScrollTwo" Orientation="Vertical"></StackPanel>//要滚动的集合二
</Canvas>
// 这里我采用的是后台动态赋值:
public partial class testScroll: UserControl
{
// 信息条数
int icount = 0;
// 信息显示高度
Double iRoadInforMation = 0;
public testScroll()
{
InitializeComponent();
this.Loaded += new RoutedEventHandler(testScroll_Loaded);
}
#region 页面初始化方法
/// <summary>
/// 页面初始化方法
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void testScroll_Loaded(object sender, RoutedEventArgs e)
{
//动态获取数据
getDataInfor();
}
#endregion
#region 获得信息
/// <summary>
/// 获得信息
/// </summary>
private void getDataInfor()
{
...... ......... // 连接数据库
// 返回成功信息
if (r.IsSucceed)
{
// 定义实体类的集合
List<R_Infor> _Data_InforList = r.Body.FromJsonString<List<R_Infor>>();
// 判断返回查询结果
if (null != _Data_InforList && 0 < _Data_InforList .Count)
{
// 根据查询信息给页面赋值
foreach (var _Infor in_Data_InforList )
{
double _fontsize = 15;
++icount;
// 定义页面滚动显示信息容器
var tbInforOne = new TextBlock();
// 设定显示信息的样式信息
tbInforOne .Text = icount + ". " + _Infor .nayiyaou(); //描述内容
tbInforOne .Tag =Infor .ID();//内容ID
tbInforOne .FontSize = _fontsize;
tbInforOne .LineHeight = _fontsize;
tbInforOne .TextWrapping = TextWrapping.Wrap; //自动换行
tbInforOne .Margin = new Thickness(3, 4, 3, 3); //位置
tbInforOne .Width = (double)325; //显示宽度
spScrollOne.Children.Add(tbTraInforOne); //显示添加上前台控件
iRoadInforMation += (tbInforOne .ActualHeight + 7); //获得实际显示高度
// 定义页面滚动显示信息容器
var tbInforTwo = new TextBlock();
tbInforTwo .Text = icount + ". " + _Infor .nayiyaou(); //描述内容
tbInforTwo .Tag =Infor .ID();//内容ID
tbInforTwo .FontSize = _fontsize;
tbInforTwo .LineHeight = _fontsize;
tbInforTwo .TextWrapping = TextWrapping.Wrap; //自动换行
tbInforOne .Margin = new Thickness(3, 4, 3, 3); //位置
tbInforTwo .Width = (double)325; //显示宽度
spScrollTwo.Children.Add(tbTraInforTwo);
}
setScrolltt();
}
}
};
_Do.Post();
}
#endregion
#region 设置滚动信息
/// <summary>
/// 设置滚动信息
/// </summary>
private void setScrolltt()
{
iRoadInforMation = iRoadInforMation + 10;
myRectangleGeometry.Rect = new Rect(0, 0, 340, iRoadInforMation);
// 控制滚动信息速度
int _marqueeTimeInSeconds = Convert.ToInt32(icount * 1.5);
spScrollOne.Height = iRoadInforMation;
spScrollTwo.Height = iRoadInforMation;
daOne.To = -iRoadInforMation;
daOne.Duration = new Duration(TimeSpan.FromSeconds(_marqueeTimeInSeconds));
daTwo.From = iRoadInforMation;
daTwo.Duration = new Duration(TimeSpan.FromSeconds(_marqueeTimeInSeconds));
}
#endregion
//这个功能困扰了我一天.希望有很多和我一样需要这个功能的朋友和大家分享下.
原始的例:<marquee onmouseover="stop()" onmouseout="start()" scrollamount="2" scrolldelay="1" height="22">
要循环的信息
</marquee>
我查阅了大量的文档和帮助,我确定自己写动画.在silverlight中没有像marquee那样简单的控件.只能自己拼:正面加上反面循环.
例子如下:因为这个是实际项目中的,下面的例子我简单的注释下,有写变量和注释写的不是很全.加上时间关系.如果有不明白的直接联系我,可查看相关文档.
或者直接来联系我:xuanrui.zhao@gmail.com
// 首先简单的描述下我做的这个功能:利用silverlight自带的动画标签:animation实现.在后台动态赋值两个集合,其实两个集合的值都是一样的就是
// 为了模拟marquee的循环.让其中一个集合在正面从上倒下,一个集合从下到上.实现滚动的假象.代码如下:
<Canvas x:Name="canMain" Background="Transparent" Cursor="Hand" >
<Canvas.Clip>
<!-- 定一个循环滚动的区域 -->
<RectangleGeometry x:Name="myRectangleGeometry" RadiusX="0" RadiusY="0" Rect="0,0, 340,50" />
</Canvas.Clip>
<Canvas.Triggers>
<EventTrigger RoutedEvent="Canvas.Loaded" >
<BeginStoryboard>
<!-- Canvas.Top :说明从下到上或者从上到下滚动 , RepeatBehavior="Forever" 为循环方式-->
<Storyboard x:Name="animation" Storyboard.TargetProperty="(Canvas.Top)" RepeatBehavior="Forever" >
<DoubleAnimation x:Name="daOne" Storyboard.TargetName="spScrollTwo" From="0" To="0" Duration="0:0:10" />
<DoubleAnimation x:Name="daTwo" Storyboard.TargetName="spScrollOne" From="0" To="0" Duration="0:0:10" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Canvas.Triggers>
<StackPanel x:Name="spScrollOne" Orientation="Vertical"></StackPanel> >//要滚动的集合一
<StackPanel x:Name="spScrollTwo" Orientation="Vertical"></StackPanel>//要滚动的集合二
</Canvas>
// 这里我采用的是后台动态赋值:
public partial class testScroll: UserControl
{
// 信息条数
int icount = 0;
// 信息显示高度
Double iRoadInforMation = 0;
public testScroll()
{
InitializeComponent();
this.Loaded += new RoutedEventHandler(testScroll_Loaded);
}
#region 页面初始化方法
/// <summary>
/// 页面初始化方法
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void testScroll_Loaded(object sender, RoutedEventArgs e)
{
//动态获取数据
getDataInfor();
}
#endregion
#region 获得信息
/// <summary>
/// 获得信息
/// </summary>
private void getDataInfor()
{
...... ......... // 连接数据库
// 返回成功信息
if (r.IsSucceed)
{
// 定义实体类的集合
List<R_Infor> _Data_InforList = r.Body.FromJsonString<List<R_Infor>>();
// 判断返回查询结果
if (null != _Data_InforList && 0 < _Data_InforList .Count)
{
// 根据查询信息给页面赋值
foreach (var _Infor in_Data_InforList )
{
double _fontsize = 15;
++icount;
// 定义页面滚动显示信息容器
var tbInforOne = new TextBlock();
// 设定显示信息的样式信息
tbInforOne .Text = icount + ". " + _Infor .nayiyaou(); //描述内容
tbInforOne .Tag =Infor .ID();//内容ID
tbInforOne .FontSize = _fontsize;
tbInforOne .LineHeight = _fontsize;
tbInforOne .TextWrapping = TextWrapping.Wrap; //自动换行
tbInforOne .Margin = new Thickness(3, 4, 3, 3); //位置
tbInforOne .Width = (double)325; //显示宽度
spScrollOne.Children.Add(tbTraInforOne); //显示添加上前台控件
iRoadInforMation += (tbInforOne .ActualHeight + 7); //获得实际显示高度
// 定义页面滚动显示信息容器
var tbInforTwo = new TextBlock();
tbInforTwo .Text = icount + ". " + _Infor .nayiyaou(); //描述内容
tbInforTwo .Tag =Infor .ID();//内容ID
tbInforTwo .FontSize = _fontsize;
tbInforTwo .LineHeight = _fontsize;
tbInforTwo .TextWrapping = TextWrapping.Wrap; //自动换行
tbInforOne .Margin = new Thickness(3, 4, 3, 3); //位置
tbInforTwo .Width = (double)325; //显示宽度
spScrollTwo.Children.Add(tbTraInforTwo);
}
setScrolltt();
}
}
};
_Do.Post();
}
#endregion
#region 设置滚动信息
/// <summary>
/// 设置滚动信息
/// </summary>
private void setScrolltt()
{
iRoadInforMation = iRoadInforMation + 10;
myRectangleGeometry.Rect = new Rect(0, 0, 340, iRoadInforMation);
// 控制滚动信息速度
int _marqueeTimeInSeconds = Convert.ToInt32(icount * 1.5);
spScrollOne.Height = iRoadInforMation;
spScrollTwo.Height = iRoadInforMation;
daOne.To = -iRoadInforMation;
daOne.Duration = new Duration(TimeSpan.FromSeconds(_marqueeTimeInSeconds));
daTwo.From = iRoadInforMation;
daTwo.Duration = new Duration(TimeSpan.FromSeconds(_marqueeTimeInSeconds));
}
#endregion
//这个功能困扰了我一天.希望有很多和我一样需要这个功能的朋友和大家分享下.
相关文章推荐
- 最近在一个外网的网站,困扰了我多天的循环和大家分享下,也做为我以后工作之用.第一种(信息作用循环.实现方式后台时钟在前台循环滚动(左右)显示).
- 有段时间没有更新博客了,最近比较忙,今天和大家分享一个使用Swift实现的新特性功能吧
- 最近负责Windows Azure项目,现在收集大家使用WA或者想使用WA时经常用到的问题有哪些
- 最近本人每天会花5分钟把前5年的工作内容做一个总结,并分享成多篇博客,让大家可以学习,交流。
- 最近项目要求开发一个echarts的小功能图表,需要动态加载数据,现在做完后把源码拷上来
- 最近做了一个Mqtt消息推送,和大家分享分享心得,以防以后搞忘了,新人第一次写博客,大神勿喷。
- 最近学习框架做了一个小网站,基本功能都实现了但是分页没办法用框架思想实现,查了资料找到一个不错的,修改了下分享下
- 本文实例讲述了AngularJS+bootstrap实现动态选择商品功能。分享给大家供大家参考,具体如下: 项目中后台一个商品库,新建活动时动态选择所需商品
- 今天堂哥给我介绍了一个很好的博客,给大家分享一下
- 最近一个小项目中使用silverlight的体会
- 最近才开通的博客~与大家一起分享之前总结的一些学习经验~~~Java陷阱小结
- 分享一个项目整体流程,对大家面试应该很有帮助
- HTTP协议中的短轮询、长轮询、长连接和短连接 序言 最近刚到公司不到一个月,正处于熟悉项目和源码的阶段,因此最近经常会看一些源码。在研究一个项目的时候,源码里面用到了HTTP的长轮询。由于之前没太
- 研究了一段时间siverlight,最近需要实现一个动画,此动画是循环滚动的动画
- 分享一个我最近写的一个 公用object,一般公司项目都能用到这些函数,我会陆续更新
- [C#]分享一个以前的项目使用的DataBaseAccess类
- 贴几个以前的项目,与大家分享一下。
- [C#]分享一个以前的项目使用的DataBaseAccess类
- 最近公司有项目要更,所以博客项目暂停更新了几周,现在继续
- 蛙蛙推荐:最近开发一个小型的OA,把常用代码和大家分享一下先