我正在尝试为长时间运行的操作显示一个请稍候对话框。问题是因为这是单线程的,即使我告诉 WaitScreen 显示它永远不会显示。有没有办法可以更改该屏幕的可见性并使其立即显示?我以 Cursor 调用为例。在我调用 this.Cursor 之后,光标立即更新。这正是我想要的行为。
private void Button_Click(object sender, RoutedEventArgs e)
{
this.Cursor = System.Windows.Input.Cursors.Pen;
WaitScreen.Visibility = Visibility.Visible;
// Do something long here
for (Int32 i = 0; i < 100000000; i++)
{
String s = i.ToString();
}
WaitScreen.Visibility = Visibility.Collapsed;
this.Cursor = System.Windows.Input.Cursors.Arrow;
}
WaitScreen 只是我隐藏和显示的 Z 索引为 99 的网格。
更新:除非万不得已,否则我真的不想使用后台 worker 。代码中有很多地方会发生这种启动和停止。
最佳答案
在单线程中执行它确实会很痛苦,而且它永远不会如您所愿地工作。在 WPF 中,窗口最终会变黑,程序会变为“无响应”。
我建议使用 BackgroundWorker 来完成长时间运行的任务。
没那么复杂。这样的事情会起作用。
private void DoWork(object sender, DoWorkEventArgs e)
{
//Do the long running process
}
private void WorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
//Hide your wait dialog
}
private void StartWork()
{
//Show your wait dialog
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += DoWork;
worker.RunWorkerCompleted += WorkerCompleted;
worker.RunWorkerAsync();
}
然后,您可以根据需要查看 ProgressChanged 事件以显示进度(请记住将 WorkerReportsProgress 设置为 true)。如果您的 DoWork 方法需要一个对象(在 e.Argument 中可用),您还可以将参数传递给 RunWorkerAsync。
这确实是最简单的方法,而不是尝试使用单线程。
关于c# - 在 WPF 中显示 "Wait"屏幕,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/616629/