Silverlight 线程\跨线程 源码实例
开发环境:VS 2010 + Silverlight 4
实例内容:
运用线程更改界面背景色
(当然,这只是一个线程的简单应用,如果只是需要更改背景色其实没必要用线程,完全可以用Time控件之类的实现。但本实例的主要
目 的是让大家清楚线程在Silverlight中应用的方法,方便大家以后运用与扩展)
1.项目结构:
2.界面UI源码:
<UserControl x:Class="Thread.MainPage" 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" mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="400"> <Grid x:Name="LayoutRoot" Background="White"> </Grid> </UserControl>
3.MainPage.xaml.cs 源码
using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Windows; using System.Windows.Controls; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Animation; using System.Windows.Shapes; namespace Thread { public partial class MainPage : UserControl { public MainPage() { InitializeComponent(); LoadEvent();//页面元素加载完成后调用线程 } private void LoadEvent() { ColorChange change = new ColorChange(); change.ColorChnagedEvent += new ColorChange.ColorChangeArg(change_ColorChnagedEvent);//订阅颜色更改事件 change.Start();//线程启动 } /// <summary> /// 由于Silverlight中不允许直接跨线程,所以需要利用委托通知界面更改 /// </summary> /// <param name="_color">颜色</param> void change_ColorChnagedEvent(Color _color) { System.Windows.Deployment.Current.Dispatcher.BeginInvoke(new ColorChange.ColorChangeArg(ChangeUIColor), _color); } /// <summary> /// 更改背景颜色 /// </summary> /// <param name="_Color"></param> private void ChangeUIColor(Color _Color) { LayoutRoot.Background = new SolidColorBrush(_Color); } } }
3.ColorChange.cs 源码
/************************************************** * 文 件 名:ColorChange.cs * 所属模块:Thread * 文件功能:启动颜色变换,事件通知进行颜色更改 * * 创 建 人:markeluo * 创建日期:2011-09-03 * 修 改 人: * 修改日期: * 备 注: * ************************************************/ using System; using System.Net; using System.Windows; using System.Windows.Controls; using System.Windows.Documents; using System.Windows.Ink; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Animation; using System.Windows.Shapes; using System.Threading; namespace Thread { /// <summary> /// 颜色控制更改类 /// </summary> public class ColorChange { public delegate void ColorChangeArg(Color _color);//委托 /// <summary> /// 颜色发生了更改 /// </summary> public event ColorChangeArg ColorChnagedEvent; /// <summary> /// 开始变换颜色 /// </summary> public void Start() { System.Threading.Thread ColorChangeThread = new System.Threading.Thread(new System.Threading.ThreadStart(ControlColorChange)); ColorChangeThread.IsBackground = true; ColorChangeThread.Start(); } /// <summary> /// 变换颜色 /// </summary> private void ControlColorChange() { for (int i = 1; i < 10; i++) { if (i % 2 == 0) { if (ColorChnagedEvent != null)//判断是否被订阅 { ColorChnagedEvent(Colors.Blue);//通知颜色发生更改,更改为蓝色 } } else { if (ColorChnagedEvent != null)//判断是否被订阅 { ColorChnagedEvent(Colors.Red);//通知颜色发生更改,更改为红色 } } System.Threading.Thread.Sleep(1000);//暂停1秒 } } } }