c# - 在 WPF 中显示 "Wait"屏幕

标签 c# .net wpf multithreading xaml

我正在尝试为长时间运行的操作显示一个请稍候对话框。问题是因为这是单线程的,即使我告诉 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/

相关文章:

c# - 如何使用 size_t 遍历 uint64*,c# 的等价物是什么?

c# - HTML Agility Pack - 选择带有选项标签的 HTML 选择标签时出现问题

c# - 为什么 BackgroundWorker 总是很忙?

c# - 如何使用其自己的 DataTemplate DependencyProperty 实现 WPF 控件?

c# - 使用 Regex 的 DataValidation 不起作用

c# - Linq Any() 与 foreach

c# - Azure 服务总线规则名称最大长度

.net - 套接字异常 : Address already in use

c# - 将项目添加到列表 T 通用方法

c# - ComboBox header 不遵守 ItemTemplate