在我的主窗口中,我有一个生成报告的按钮。但该报告需要大约15秒才能构建,因此我只想提出一个小对话框,要求用户“请等待”。然后,当报告窗口被激活时,它就会消失。下面的工作除了“请等待”对话框只生成窗口的shell,没有内容。 这是代码:
WD_PleaseWaitDialog _pWait = null;
private void ReportButton_Click( object sender, RoutedEventArgs e )
{
_pWait = new WD_PleaseWaitDialog();
_pWait.Show();
ReportWindow reportWindow = new ReportWindow(); // takes 15 seconds to execute
reportWindow.Activated += closePleaseWaitWindow;
reportWindow.Show();
}
private void closePleaseWaitWindow( object sender, System.EventArgs e )
{
_pWait.Close();
}
答案 0 :(得分:0)
正在发生的事情是您的WD_PleaseWaitDialog
被实例化,当您Show()
时,它会进入Loaded
状态,但这就是Rendered
生命周期状态之前的状态。这是在您创建ReportWindow
时,需要一段时间才能处理(根据您的情况为15秒)。发生的事情是你在这段时间内基本上阻止了主线程,这阻止了WD_PleaseWaitDialog
完成其生命周期的渲染阶段。当您的ReportWindow
完成加载时,它们都会被渲染,但是它很快就会在关闭之前看不到WD_PleaseWaitDialog
的内容。
你可以做几件事......
您可以尝试使用ContentRendered
的{{1}}事件来继续执行其余代码。但是,这两个窗户耦合......而这不是我个人喜欢的东西。
您可以考虑使用不同的线程。 WD_PleaseWaitDialog
课程可以为您提供很大帮助。可以采取的一种方法是将Task
中的冗长操作放入ReportWindow
:
Task
完成操作后,您需要回调主线程以关闭Task.Run(() => { // lengthy operation here });
(因为您无法在其他线程中处理UI操作):
WD_PleaseWaitDialog
除非你真的陷入困境,否则我不会向你提供整个代码。尝试自己动手,因为我已经为你提供了大量的信息来开始。希望有所帮助。
答案 1 :(得分:0)
使用dispatcher.begininvoke生成并显示报告
Dispatcher.BeginInvoke(new Action(()=>{ /* report window */ });
答案 2 :(得分:0)
谢谢大家的回答。这是一个很棒的网站,为我提供了很多好消息。这是有效的,但它似乎并不像我希望的那样优雅:
private void ReportButton_Click( object sender, RoutedEventArgs e )
{
reportWindow = new BackUp.ReportWindow();
StatusBarTextBox.Text = "Generating report for \"" + DestinationDirectoryTextBox.Text + "\"";
StartWork();
} // END ReportButton_Click
private void StartWork()
{
_pWait = new WD_PleaseWaitDialog();
_pWait.Show();
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += DoWork;
worker.RunWorkerCompleted += WorkerCompleted;
worker.RunWorkerAsync();
}
private void DoWork( object sender, DoWorkEventArgs e )
{
reportWindow.initializeReportWindow( _dailyList, _weeklyList, _monthlyList, _semiAnnualList );
}
private void WorkerCompleted( object sender, RunWorkerCompletedEventArgs e )
{
_pWait.Close();
reportWindow.Show();
}
通过这种方法,我不得不将ReportWindow初始化移出构造函数并将其移动到访问器。