【问题标题】:Showing a wait dialog while doing interface operations in C#在 C# 中执行接口操作时显示等待对话框
【发布时间】:2011-04-17 16:59:09
【问题描述】:

所以我需要在我的程序中执行繁重的界面操作...更具体地说,填充 Windows 窗体 列表视图并动态生成图像。这不能在另一个线程上完成。
那么如何在我的 WPF 主窗口上显示一个模态的工作(响应)对话框?
对话框可以是WPF也可以是winforms,我不管,我会适应的……

它必须是可用的,并且始终保持在上面并以模态方式阻止它的所有者形式。

【问题讨论】:

  • 你认为不能在另一个线程上进行的操作到底是什么?
  • @jdv-Jan de Vaan:当你更新一个控件时,你必须从与所有者相同的线程中进行,除非你遵循一个我记不太清的特定程序,但这不是仍然很难做到。这是另一个问题的参考:stackoverflow.com/questions/1136399/…
  • 可以在其他线程上完成。 UI 的更新当然不能。但一个不是另一个。
  • @Eugenio:我知道。我在问 OP。
  • @jdv-Jan de Vaan:好的。我提供了信息以供提问者参考...我也想刷新一下...

标签: c# wpf winforms multithreading modal-dialog


【解决方案1】:

只需实现一个对话框并在耗时的函数中使用 .ShowDialog() 调用它。无论您有耗时的循环,每隔一段时间调用一次 Application.DoEvents() 以允许对话框显示和更新。不过要小心这种方法......

请注意,例如,如果您正在处理一个 Paint 事件,然后调用 Application.DoEvents(),您可能会两次进入 Paint 事件处理程序,这是不可取的。

【讨论】:

  • 我怎么没想到呢?谢谢!
  • @Vercas:你是什么意思它阻止了这个功能?该函数应该完成执行...
  • @Vercas:如果您在模态窗口中遇到问题,请使用 .Show(),但使用 Form 的 TopMost 属性使其看起来像模态。
【解决方案2】:

在 WPF 窗口或 WinForm 上放置图像并插入:http://www.hindustantimes.com/images/loading_gif.gif,它将自动获得动画效果。使用.ShowDialog(OwnerWindow) 显示窗口,因此它将始终保持在其所有者窗口的顶部。

【讨论】:

  • 但是界面仍然无法交互,所以这还不够……顺便说一句,图片真棒!
【解决方案3】:

如果您可以调用 Application.DoEvents 并且它可以正常工作,那么这肯定是一种方法。然而,根据我的经验,Application.DoEvents 几乎总是一个 hack,很少是一个好主意。

我的第一个想法是,也许您可​​以创建一个后台线程来生成您的图像。开始您的线程并显示您的模态对话框。对于您的线程,在创建一定数量(例如 5、10、20、50 等等)之后,它将调用事件调度程序并执行一个方法,该方法使用新一批图像更新 ListView。因为它只是定期调用,它会给模态对话框时间来处理它自己的消息。您在事件调度程序上调用的函数将接收图像列表,调用 ListView.BeginUpdate(),循环遍历列表并创建和添加项目,然后调用 ListView.EndUpdate()

还有其他方法可以做到这一点,但我真的会尽量避免 Application.DoEvents() (根据我的经验,这是来自不了解线程的 Visual Basic 程序员的黑客行为)。

【讨论】:

  • 你甚至可以在后台线程中添加一个秒表,让它每隔这么多秒更新一次列表,而不是计算图像。在每张图片上更新你的 gui 似乎是个坏主意(很多 gui 更新)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 2013-07-14
  • 1970-01-01
  • 1970-01-01
  • 2013-03-21
  • 1970-01-01
相关资源
最近更新 更多