public Pachertime(){InitializeComponent(); DispatcherTimer time = new DispatcherTimer();time.Interval = new TimeSpan(0, 0, 1);time.Tick += new EventHandler(time_Tick);time.Start();}void time_Tick(object sender, EventArgs e){tbkTimer.Text = "当前时间:" + DateTime.Now.ToLongTimeString();}
主要代码如上,则在客户端可以看到一个在不断更新的时间;DispatchTimer主要适合于调度任务的情况。事实上,除StoryBoard组件之外dispatcherTimer也是Silverlight编程中实现动画效果的一种重要技术。当然,我们应该当心使用dispatcherTimer有可能导致创建太多的后台线程,从而有可能导致增加CPU的负荷而降低效率。
Dispatcher同样的需要使用using System.Windows.Threading命名空间;Dispatcher 类当前只提供从非用户界面 (UI) 线程在 UI 上运行代码的支持。 您可以通过 DependencyObject . Dispatcher 和 ScriptObject . Dispatcher 属性访问 UI 线程的 Dispatcher 对象。这些方法是实例方法,但这些类型的实例无法频繁从非 UI 线程访问。
下面是一个实现倒计时功能的例子:
前台XAMl代码:
<UserControl x:Class="slStudy.Timer"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"><StackPanel x:Name="layerout" ><Border x:Name="border" Background="AliceBlue" Width="200" Height="50" Margin="5" BorderBrush="Black" BorderThickness="3" CornerRadius="5"></Border><StackPanel Margin="80 0 0 0" Orientation="Horizontal" Width="188"><Button Content="开始" x:Name="btnStart" Width="66" Height="30" Margin="5" Click="btnStart_Click"></Button><Button Content="延迟" x:Name="btnJoin" Width="100" Height="30" Margin="5" Click="btnJoin_Click"></Button></StackPanel></StackPanel></UserControl>
后台C#代码如下:
public partial class Timer : UserControl{private static System.Windows.Controls.TextBlock tbk;private Thread thread;public Timer(){InitializeComponent();tbk = new TextBlock(){FontSize = 15,Width = 300,Height = 100,};border.Child = tbk; thread = new Thread(Timer.SetText);}public static void SetText(){int i = 60;while (i > 0){ tbk.Dispatcher.BeginInvoke(delegate(){tbk.Text = "倒计时:" + i + "秒";});i--; Thread.Sleep(1000);}}private void btnStart_Click(object sender, RoutedEventArgs e){thread.Start();}private void btnJoin_Click(object sender, RoutedEventArgs e){thread.Join(2000);}}
联系客服