2009-11-13 65 views
1

我正在处理用户选择大文件后。我的代码如下所示:Silverlight OpenFileDialog等效DoEvents

if (FileDialog.ShowDialog() == true) { 
    // process really big file 
} 

这冻结了UI,所以我想首先显示加载消息的用户选择的文件给他们一个视觉线索的东西正在发生前:

loadingMessage.Visibility = Visibility.Visible; 
if (FileDialog.ShowDialog() == true) { 
    // process really big file 
} 

不幸的是,当文件正在处理时,这仍然完全冻结了用户界面。

我发现完美的作品是如果我在文件选择后立即激活MessageBox。我认为它在底层做了一个“DoEvents”类型的调用,以在运行时获得flush事件/ ui项。

loadingMessage.Visibility = Visibility.Visible; 
if (FileDialog.ShowDialog() == true) { 
    MessageBox.Show("Sync!"); 
    // process really big file 
} 

在这样的大文件仍在处理为慢,但显示的加载信息,并且屏幕UI被同步的了(我在做真实的东西一些其他的东西,如显示等待光标案例)。

问:

Silverlight有没有的DoEvents功能。除了MessageBox.Show之外,是否还有一个调用可以实现同步UI和防止OpenFileDialog冻结UI的效果?

回答

1

使用BackgroundWorker在后台执行繁重的计算。当您想要通知UI该操作已完成时,可以使用上述类的RunWorkerCompleted事件。另一种方法是使用完全独立的线程,然后使用Dispatcher.BeginInvoke()回调UI线程。请记住,在独立的线程中,如果没有这种同步,就无法访​​问任何GUI组件。