所以我需要在我的程序中进行繁重的界面操作......更具体地说,填充 Windows窗体列表视图并动态生成图像。这不能在另一个线程上完成 那么如何在主 WPF 窗口上显示模态,工作(响应)对话框? 对话框可以是WPF或winforms,我不在乎,我会适应......
它必须可用并始终保持在上面并以模态方式阻止它的所有者形式。
答案 0 :(得分:2)
只需实现一个对话框,然后在耗时的函数中使用.ShowDialog()调用它。无论您何时拥有耗时的循环,请每隔一段时间调用Application.DoEvents()以允许显示和更新对话框。小心这种方法,但是......
请注意,例如,如果您正在处理Paint事件,然后调用Application.DoEvents(),则可能会两次输入Paint事件处理程序,这是不可取的。
答案 1 :(得分:1)
在WPF窗口或WinForm上放置一个图像并插入:http://www.hindustantimes.com/images/loading_gif.gif,它将自动获得动画。使用.ShowDialog(OwnerWindow)
显示窗口,因此它将始终保持在其所有者窗口之上。
答案 2 :(得分:0)
如果您可以调用Application.DoEvents并且它可以正常工作,那么这肯定是一种方法。但是,根据我的经验,Application.DoEvents总是一个黑客,很少是一个好主意。
我的第一个想法是,也许你可以创建一个生成图像的后台线程。开始你的线程并显示你的模态对话框。对于你的线程,在创建了一定数量(例如5,10,20,50等)之后,它会调用事件调度程序并执行一个方法,用新批量的图像更新ListView。因为它只是定期调用它会给模态对话时间来处理它自己的消息。您在事件调度程序上调用的函数将收到一个图像列表,调用ListView.BeginUpdate(),循环遍历列表并创建和添加项目,然后调用ListView.EndUpdate()
还有其他方法可以做到这一点,但我真的会尝试避免Application.DoEvents()(根据我的经验,这是来自不了解线程的Visual Basic程序员的黑客攻击)。