2011-04-17 49 views
0

因此,我需要在我的程序中执行繁重的接口操作...更具体地说,填充一个Windows窗体列表视图和动态生成图像。这不能在另一个线程上完成。
那么如何通过我的主要WPF窗口显示模式,工作(响应)对话框?
该对话框可以是WPF或winforms,我不在乎,我会适应.​​..在C#中进行接口操作时显示等待对话框

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

+0

你认为你不能在另一个线程上做什么操作? – 2011-04-17 17:07:17

+0

@ jdv-Jan de Vaan:当你更新一个控件时,除非你遵循一个我记不清的特定过程,否则你必须从所有者的同一个线程来完成它,但要做到这一点并不难。这是另一个问题的参考:http://stackoverflow.com/questions/1136399/how-to-update-textbox-on-gui-from-another-thread-in-c – 2011-04-17 17:10:54

+0

它可以在其他线程完成。当然,UI的更新不能。但其中一个不是另一个。 – Will 2011-04-17 17:14:35

回答

2

只需实现一个对话框,并在耗时函数中使用.ShowDialog()来调用它。无论何时你有耗时的循环,每隔一段时间调用一次Application.DoEvents()以允许对话框显示和更新。虽然...

要小心,因为如果,例如,如果您正在处理Paint事件,然后调用Application.DoEvents(),您可能会输入Paint事件处理程序两次,这是不可取的。

+0

我到底怎么没有想到这个?谢谢! – Vercas 2011-04-17 20:08:26

+0

等一下。该对话框以这种方式阻止该功能... – Vercas 2011-04-17 20:18:44

+0

@Vercas:你是什么意思它阻止了该功能?该函数应该完成执行... – 2011-04-17 22:13:43

1

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

+0

但界面仍然是不可交互的,所以这是不够的... BTW真棒图像! – Vercas 2011-04-19 09:45:33

0

如果你可以调用Application.DoEvents并且它工作正常,那么这肯定是一种方法。但是,根据我的经验,Application.DoEvents通常是一种破解,而且很少是一个好主意。

我首先想到的是,也许你可以创建一个后台线程来生成你的图像。开始你的线程并显示你的模态对话框。对于你的线程,在创建了一定数量(例如5,10,20,50,无论)之后,它会调用事件分派器并执行一个方法,使用新批次的图像更新ListView。因为它只是周期性的调用,所以会给Modal Dialog时间来处理它自己的消息。您在事件调度程序上调用的函数将收到图像列表,调用ListView.BeginUpdate(),遍历列表并创建和添加项目,然后调用ListView.EndUpdate()

还有其他方法可以执行这个,但我真的会尝试避免Application.DoEvents()(根据我的经验,这是来自不懂线程的Visual Basic程序员的黑客)。

+0

你甚至可以添加一个秒表到你的后台线程,让它每隔几秒更新列表而不是计数图像。在每张图片上更新你的gui似乎是一个糟糕的主意(很多gui更新)。 – Alan 2012-10-15 09:42:25