C#WPF试图建立一个Please Wait对话框

时间:2015-02-28 20:28:08

标签: c# wpf

在我的主窗口中,我有一个生成报告的按钮。但该报告需要大约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();
}

3 个答案:

答案 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初始化移出构造函数并将其移动到访问器。