WPF实现倒计时
用WPF做一个简单的倒计时。
实现代码如下:
首先布局样式,XAML代码:
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="2*"/>
<RowDefinition Height="1*"/>
</Grid.RowDefinitions>
</Grid>
<Grid Grid.Row="0">
<TextBox Background="#dddddd" Margin="69,68,76,-84" x:Name="DaoJiShi" FontSize="20" VerticalContentAlignment="Center" TextAlignment="Center" Height="39"/>
</Grid>
<Grid Grid.Row="1">
<Button Name="Start" Background="CadetBlue" Margin="69,140,74,-156" ToolTip="开始" Click="Start_Click">开始</Button>
</Grid>
布局样式后,到后台代码:
private int countSecond = 10;//设置秒数(初始化值)
public void disTimer_Tick(object sender, EventArgs e)
{
if (countSecond == -1)
{
MessageBox.Show("10秒倒计时已结束!", "系统提示", MessageBoxButton.OK, MessageBoxImage.Warning);
disTimer.Stop();//计时停止
}
else
{
//判断是否处于UI线程上
if (DaoJiShi.Dispatcher.CheckAccess())
{
DaoJiShi.Text = countSecond.ToString() + "秒";
}
else
{
DaoJiShi.Dispatcher.BeginInvoke(DispatcherPriority.Normal, (Action)(() => {
DaoJiShi.Text = countSecond.ToString() + "秒";
}));
}
countSecond--;
}
}
private DispatcherTimer disTimer = new DispatcherTimer();
public void CountDown()
{
//设置定时器
disTimer.Tick += new EventHandler(disTimer_Tick);//每一秒执行的方法
disTimer.Interval = new TimeSpan(10000000); //时间间隔为一秒。
disTimer.Start();//计时开始
}
private void Start_Click(object sender, RoutedEventArgs e)
{
CountDown();//执行方法
}
注意:“Timer”和“DispatcherTimer”的区别:
Timer必须使用this.Dispatcher.BeginInvoke去更新UI,DispatcherTimer 可以直接更新UI
这两者区别是 Timer在非UI线程跑的,DispatcherTimer是在UI线程跑的。
需要注意的是在WPF中涉及到界面操作的话,一定要使用DispatcherTimer,DispatcherTimer是为WPF专门设计的,不然的话会提示界面资源被其他线程所拥有而无法更新界面。
上图是点击开始后的结果图。
上图是设置10秒钟时间结束完成弹出的消息框。
上图是设置10秒钟时间结束后的结果图。