WPF中UI线程更新

WPF中UI线程更新
2011-11-11 16:11
WPF 中 UI 线程队列由 Dispatcher 来管理和调度,所以当用户线程中更新 UI 时,必须通过 Dispatche 来调度,下面这个小例子将给用户展示如何在用户线程中更新当前的时间 .
前台的 XAML 代码如下:
< Window x:Class = "ThreadInvoke.Window1"
xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"
Title = "ThreadInvoke"Height="300"Width="300"
>
< StackPanel Orientation = "Vertical">
< StackPanel Orientation = "Horizontal">
< Button Content = "Ok"Click="okClick"Width="50"/>
< Button Content = "Stop"Click="stopClick"Width="50"/>
</ StackPanel >
< TextBox Name = "timeText"></TextBox>
</ StackPanel >
</ Window >
后台的主要代码如下:
// 申明一个代理用于想 UI 更新时间
private delegatevoidDelegateSetCurrentTime();
// 申明一个变量,用于停止时间的跳动
private bool stopFlag = false;
// 处理开始和结束事件
private void okClick(object sender,RoutedEventArgs args)
{
stopFlag = false;
Thread thread = newThread(newThreadStart(refreshTime));
thread.Start();
}
privatevoid stopClick(object sender, RoutedEventArgs args)
{
stopFlag = true;
}
//用户线程的实现函数
privatevoid refreshTime()
{
while (!stopFlag)
{
//向UI界面更新时钟显示 Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.SystemIdle, newDelegateSetCurrentTime(setCurrentTime));
}
}
privatevoid setCurrentTime()
{
String currentTime = System.DateTime.Now.ToString();
timeText.Text = currentTime;
}
2007-1-8 Paul.Peng

转载于:https://www.cnblogs.com/vmyspace/archive/2011/12/27/2303305.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WPFUI元素的更新只能在UI线程上进行,这意味着如果我们在其他线程上进行数据操作,然后再尝试更新UI元素,会出现异常或者UI不会立即更新的情况。 要在WPF实现线程安全的UI更新,可以使用Dispatcher类。Dispatcher类可以让我们将操作在UI线程上执行,即使我们是在其他线程上调用的。 首先,我们需要获取到当前UI元素所在的Dispatcher对象,可以通过UI元素的Dispatcher属性来获取。然后,我们可以使用Dispatcher对象的Invoke或BeginInvoke方法将操作委托给UI线程执行。 例如,如果我们有一个DataGrid控件需要更新,我们可以首先获取DataGrid控件的Dispatcher对象,并在其他线程上进行数据操作后,使用Dispatcher对象的Invoke方法来更新DataGrid控件的数据源。 示例代码如下: ```csharp // 获取DataGrid的Dispatcher对象 var dispatcher = dataGrid.Dispatcher; // 在其他线程上进行数据操作 Task.Run(() => { // 模拟一些数据操作 Thread.Sleep(1000); // 更新DataGrid的数据源 var newData = GetData(); // 通过Dispatcher对象的Invoke方法,在UI线程更新DataGrid的数据源 dispatcher.Invoke(() => { dataGrid.ItemsSource = newData; }); }); ``` 在这个示例,我们使用了Task.Run()方法来模拟在其他线程上进行数据操作,然后通过Dispatcher对象的Invoke方法,在UI线程更新DataGrid控件的数据源。 通过使用Dispatcher类,我们可以确保在任何线程上进行的UI更新操作都会在UI线程上执行,保证了数据操作和UI更新线程安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值