如何解决WPF元素事件处理程序中的UI更新
| WPF中的UI更新存在问题。 我有这样的代码: private void ButtonClick_EventHandler(object sender,RoutedEventArgs e)
{
Label.Visibility = Visibility.Visible;
TextBox.Text = \"Processing...\";
LongTimeMethod(); //some long operation
}
问题在于,直到LongTimeMethod结束(即事件处理程序结束),Label.Visibility和TextBox.Text才会更改。
到目前为止,我已经这样解决了:
private void ButtonClick_EventHandler(object sender,RoutedEventArgs e)
{
Label.Visibility = Visibility.Visible;
TextBox.Text = \"Processing...\";
Dispatcher.BeginInvoke(new Action(LongTimeMethod),DispatcherPriority.Background);
}
没有使用调度程序调用的其他解决方案吗?调用this.UpdateLayout()没有帮助。
解决方法
对于
Dispatcher.BeginInvoke
,您仍在使用thread3ѭ的UI线程。如果这不是必需的(即它正在执行某种后台处理),我建议使用TPL在后台线程上运行它:
private void ButtonClick_EventHandler(object sender,RoutedEventArgs e)
{
Label.Visibility = Visibility.Visible;
TextBox.Text = \"Processing...\";
Task.Factory.StartNew(() => LongTimeMethod())
.ContinueWith(t =>
{
Dispatcher.BeginInvoke((Action)delegate()
{
TextBox.Text = \"Done!\";
});
});
}
使用此方法,可以在后台线程上处理长时间运行的方法(因此UI线程将可以自由保持渲染,并且应用程序不会冻结),并且您可以执行任何会改变UI的操作(例如更新UI)后台任务完成时,在用户界面“ 5”上显示文本框文本)
, 可见性和文本是依赖属性,由调度程序更新。您的解决方案绝对是正确的,但我的建议是异步进行。
另一方面,您可以在WPF中模拟Application.DoEvents(请参阅文章)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。