Silverlight之ListBox/Style学习笔记--ListBox版的图片轮换广告
2011-04-18 14:14
232 查看
ListBox是一个很有用的控件,其功能直逼Asp.Net中的Repeater,它能实现自定义数据项模板,纵向/横向排列Item(如果扩展一下实现自行折行,几乎就是SL版的Repeater了--实际上WrapPanel已经实现了,不过没有默认集成在SL3中).
这里推荐一个老外的文章 http://blogs.msdn.com/delay/archive/2008/03/05/lb-sv-faq-examples-notes-tips-and-more-for-silverlight-2-beta-1-s-listbox-and-scrollviewer-controls.aspx 基本上ListBox的各种用法和注意点都在里面了(E文的,只看代码就行了)
另外关于Style,这个东西刚开始学习时,还以为自己能靠死记硬背掌握绝大多数控件的模板,后来发现这是徒劳!每个控件的默认样式/模板,都有N长,全凭记忆不太现实,我的经验是如果需要定义某一个控件的样式,直接用Blend先编辑副本,得到完整的"样本",然后在此基础上做些修改或删减,这样更可行。
Xaml中的资源是个很庞大的概念:样式,模板,动画,触发器,甚至数据集(引用)...都可以称之为Resource.这一点与web开发中的css完全不同。
在学习Style的过程中,经常会遇到另外一个概念:模板(Template),初期经常被他们搞混淆,其实这二者有明显的区别:Style影响外观,而Template影响内容,它们之间通过绑定联系起来(它们之间的联系也可以这样理解:如果不进行数据绑定,即使定义了模板,最终也不会有内容,既然连内容都没有了,所以也谈不上外观--即所谓的数据驱动UI)
这里举一个ListBox的例子:
Xaml.cs
using System;
using System.Collections.ObjectModel;
using System.Reflection;
using System.Windows;
using System.Windows.Browser;
using System.Windows.Controls;
using System.Windows.Threading;
using System.Windows.Shapes;
namespace ListBoxSilde
{
public partial class MainPage : UserControl
{
ObservableCollection<ImageItem> _Items;
int _CurrentIndex = 0;//当前索引号(从0开始)
DispatcherTimer _timer;
public MainPage()
{
InitializeComponent();
this.Loaded += new RoutedEventHandler(MainPage_Loaded);
}
void MainPage_Loaded(object sender, RoutedEventArgs e)
{
string _ArremblyName = Assembly.GetExecutingAssembly().FullName.Split(',')[0];
_Items = new ObservableCollection<ImageItem>();
for (int i = 1; i <= 4; i++)
{
string _img = "http://images.24city.com/jimmy/ListBoxSlideShow/img/00" + i.ToString() + ".jpg";
_Items.Add(new ImageItem() { ImageUri = _img, Title = "这是图片00" + i.ToString() + ".jpg", ClickUri = _img, Index = i });
}
this.lstImage.ItemsSource = _Items;
this.lstNav.ItemsSource = _Items;
this.lstNav.SelectedIndex = _CurrentIndex;
_timer = new DispatcherTimer();
_timer.Interval = new System.TimeSpan(0, 0, 2);
_timer.Tick += new System.EventHandler(_timer_Tick);
_timer.Start();
}
void _timer_Tick(object sender, System.EventArgs e)
{
kTo.Value = _CurrentIndex * -480;
sbMove.Begin();
lstNav.SelectedIndex = _CurrentIndex;
_CurrentIndex++;
if (_CurrentIndex >= _Items.Count)
{
_CurrentIndex = 0;
}
}
private void LayoutRoot_MouseEnter(object sender, System.Windows.Input.MouseEventArgs e)
{
_timer.Stop();
}
private void LayoutRoot_MouseLeave(object sender, System.Windows.Input.MouseEventArgs e)
{
_timer.Start();
}
private void Image_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
HtmlPage.Window.Navigate(new Uri(_Items[this.lstNav.SelectedIndex].ClickUri), "_target");
}
private void txtDebug_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
HtmlPage.Window.Navigate(new Uri("http://yjmyzz.cnblogs.com/"), "_target");
}
private void NavItemClick(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
StackPanel g = (sender as StackPanel);
TextBlock txt = g.Children[0] as TextBlock;
int Index = int.Parse(txt.Text);
kTo.Value = (Index - 1) * -480;
sbMove.Begin();
_CurrentIndex = Index - 1;
lstNav.SelectedIndex = _CurrentIndex;
}
}
public class ImageItem
{
public string ImageUri { set; get; }
public string Title { set; get; }
public string ClickUri { set; get; }
public int Index { set; get; }
}
}
这里推荐一个老外的文章 http://blogs.msdn.com/delay/archive/2008/03/05/lb-sv-faq-examples-notes-tips-and-more-for-silverlight-2-beta-1-s-listbox-and-scrollviewer-controls.aspx 基本上ListBox的各种用法和注意点都在里面了(E文的,只看代码就行了)
另外关于Style,这个东西刚开始学习时,还以为自己能靠死记硬背掌握绝大多数控件的模板,后来发现这是徒劳!每个控件的默认样式/模板,都有N长,全凭记忆不太现实,我的经验是如果需要定义某一个控件的样式,直接用Blend先编辑副本,得到完整的"样本",然后在此基础上做些修改或删减,这样更可行。
Xaml中的资源是个很庞大的概念:样式,模板,动画,触发器,甚至数据集(引用)...都可以称之为Resource.这一点与web开发中的css完全不同。
在学习Style的过程中,经常会遇到另外一个概念:模板(Template),初期经常被他们搞混淆,其实这二者有明显的区别:Style影响外观,而Template影响内容,它们之间通过绑定联系起来(它们之间的联系也可以这样理解:如果不进行数据绑定,即使定义了模板,最终也不会有内容,既然连内容都没有了,所以也谈不上外观--即所谓的数据驱动UI)
这里举一个ListBox的例子:
Xaml.cs
using System;
using System.Collections.ObjectModel;
using System.Reflection;
using System.Windows;
using System.Windows.Browser;
using System.Windows.Controls;
using System.Windows.Threading;
using System.Windows.Shapes;
namespace ListBoxSilde
{
public partial class MainPage : UserControl
{
ObservableCollection<ImageItem> _Items;
int _CurrentIndex = 0;//当前索引号(从0开始)
DispatcherTimer _timer;
public MainPage()
{
InitializeComponent();
this.Loaded += new RoutedEventHandler(MainPage_Loaded);
}
void MainPage_Loaded(object sender, RoutedEventArgs e)
{
string _ArremblyName = Assembly.GetExecutingAssembly().FullName.Split(',')[0];
_Items = new ObservableCollection<ImageItem>();
for (int i = 1; i <= 4; i++)
{
string _img = "http://images.24city.com/jimmy/ListBoxSlideShow/img/00" + i.ToString() + ".jpg";
_Items.Add(new ImageItem() { ImageUri = _img, Title = "这是图片00" + i.ToString() + ".jpg", ClickUri = _img, Index = i });
}
this.lstImage.ItemsSource = _Items;
this.lstNav.ItemsSource = _Items;
this.lstNav.SelectedIndex = _CurrentIndex;
_timer = new DispatcherTimer();
_timer.Interval = new System.TimeSpan(0, 0, 2);
_timer.Tick += new System.EventHandler(_timer_Tick);
_timer.Start();
}
void _timer_Tick(object sender, System.EventArgs e)
{
kTo.Value = _CurrentIndex * -480;
sbMove.Begin();
lstNav.SelectedIndex = _CurrentIndex;
_CurrentIndex++;
if (_CurrentIndex >= _Items.Count)
{
_CurrentIndex = 0;
}
}
private void LayoutRoot_MouseEnter(object sender, System.Windows.Input.MouseEventArgs e)
{
_timer.Stop();
}
private void LayoutRoot_MouseLeave(object sender, System.Windows.Input.MouseEventArgs e)
{
_timer.Start();
}
private void Image_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
HtmlPage.Window.Navigate(new Uri(_Items[this.lstNav.SelectedIndex].ClickUri), "_target");
}
private void txtDebug_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
HtmlPage.Window.Navigate(new Uri("http://yjmyzz.cnblogs.com/"), "_target");
}
private void NavItemClick(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
StackPanel g = (sender as StackPanel);
TextBlock txt = g.Children[0] as TextBlock;
int Index = int.Parse(txt.Text);
kTo.Value = (Index - 1) * -480;
sbMove.Begin();
_CurrentIndex = Index - 1;
lstNav.SelectedIndex = _CurrentIndex;
}
}
public class ImageItem
{
public string ImageUri { set; get; }
public string Title { set; get; }
public string ClickUri { set; get; }
public int Index { set; get; }
}
}
相关文章推荐
- Silverlight之ListBox/Style学习笔记--ListBox版的图片轮换广告
- WPF and Silverlight 学习笔记(十八):WPF样式(Style)与模板(Template)
- Silverlight学习笔记五( 在Silverlight 2.0/3.0/4.0 中使用OpenFileDialog浏览本地图片)
- silverlight学习笔记。Style的继承(BaseOn)默认样式的问题
- Silverlight学习笔记十七BingMap(六)之获取图片系统的图片信息ImageryService的应用
- Silverlight学习笔记第一季(2)Listbox横向绑定数据
- [Silverlight学习笔记]如何滚动没有滚动条的ListBox?
- SilverLight学习笔记--实际应用(二) 建立一个轮盘图片展示程序
- Silverlight学习笔记十二动态加载图片和显示提示(ToolTip)
- Silverlight Toolkit ListBoxDragDropTarget学习笔记
- Silverlight学习笔记(4)——数据绑定ListBox
- SilverLight学习笔记--关于Silverlight资源文件(如:图片)的放置位置及其引用
- 学习笔记:Silverlight 三种动画 图片截取 循环给二维数组赋值
- SilverLight学习笔记--关于Silverlight资源文件(如:图片)的放置位置及其引用
- WPF and Silverlight 学习笔记(十八):WPF样式(Style)与模板(Template)
- [Silverlight学习笔记]实现上传图片功能时遇到的问题
- 有关ImplicitStyleManager组件的研究——Silverlight学习笔记[30]
- 学习笔记之图片轮换效果
- WPF and Silverlight 学习笔记(十五):WPF命令(Commands)
- opencv学习笔记--将多帧图片保存为视频