Silverlight openfiledialog doevents等效
-
20-09-2019 - |
题
用户选择大型文件后,我正在处理大文件。我的代码看起来如下:
if (FileDialog.ShowDialog() == true) {
// process really big file
}
这使UI冻结了,因此我尝试先显示加载消息,然后用户选择该文件以给他们一个视觉提示,即发生了一些事情:
loadingMessage.Visibility = Visibility.Visible;
if (FileDialog.ShowDialog() == true) {
// process really big file
}
不幸的是,在处理文件时,这仍然完全冻结UI。
我发现的完美工作是,如果我在文件选择后立即发出消息框。我认为它在引擎盖下进行“ Doevents”类型调用,以在运行时获得齐平活动/UI项目。
loadingMessage.Visibility = Visibility.Visible;
if (FileDialog.ShowDialog() == true) {
MessageBox.Show("Sync!");
// process really big file
}
在这样的情况下,大文件仍然以缓慢的速度处理,但是显示了加载消息,并且屏幕UI被同步了(我在真实的事情中做了其他事情,例如显示等待光标)。
问题:
Silverlight没有Doevents功能。除了MessageBox以外,我可以打个电话。显示具有同步UI并防止OpenFileDialog冻结UI的效果相同吗?
解决方案
使用背景工作者在后台执行重型计算。当您要通知UI完成操作已完成时,可以使用上述类的RunWorkerComplet事件。替代方法是使用一个完全独立的线程,然后使用dispatcher.begininvoke()回调到UI线程。请记住,使用.NET在单独的线程中,如果没有这种同步,您将无法访问任何GUI组件。
其他提示
使用背景工类类在背景线程上处理您真正的大文件?这里有一个链接: 如何:使用背景工作者
不隶属于 StackOverflow