【发布时间】:2012-03-24 14:44:40
【问题描述】:
如果你不熟悉Ookii.Dialogs,我建议你先look at this web page。它是开源的,您可以在那里找到源代码、编译的二进制文件、文档和示例应用程序作为下载。
在我的应用程序中,我使用 Ookii.Dialogs.Wpf.ProgressDialog 来 ShowDialog(this) 一个对文件进行一些处理的进度对话框( this 始终是应用程序的主窗口)。正如预期的那样,进度对话框大约需要一秒钟才能真正可见(即使它已经在处理我的文件)。
在进度对话框的 DoWork 线程中,我还在检查输出文件是否已经存在并询问用户是覆盖每个文件还是跳过输出。我使用 Ookii.Dialogs.Wpf.TaskDialog 来 ShowDialog(this) 一个 “带有命令链接的任务对话框”(看起来像 this)并询问用户覆盖问题 - 除非操作系统不支持它,否则我会退回到常规 MessageBox (问题也适用于消息框 )。
当我的应用程序在进度对话框的 DoWork 线程的开头找到一个现有文件时,就会出现问题。当任务对话框出现询问用户是否覆盖时:
预期行为:任务对话框必须保持在顶部。当进度对话框出现时(延迟 1s 后),它必须出现在任务对话框的后面。
实际行为:任务对话框没有停留在最前面。延迟 1 秒后出现进度对话框时),它出现在任务对话框的顶部。
当进度对话框已经可见时,后续覆盖请求中不会发生实际行为。任务对话框正确显示在后续对话框的进度对话框顶部,尽管用户可以来回切换两个对话框(只是不能从其中任何一个切换到主窗口)。
我正在寻找这个:
- 最佳解决方案:使任务对话框显示为模态在进度对话框中。如果用户尝试切换到进度对话框,则不得允许用户这样做。
- 次优:即使进度对话框在 1 秒延迟后出现,任务对话框的首次出现也保持在最前面。
我不是在寻找以下内容:
- 设置任务对话框的始终处于顶部的标志。我不希望任务对话框始终显示在用户计算机上每个窗口的顶部。
- 在任务对话框出现之前添加延迟。我试过 Thread.Sleep() 甚至在一个循环中,它只是挂起所有的执行,并没有解决问题。
- 等到进度对话框出现后再显示任务对话框。理论上可以工作,但我没有找到方法知道进度对话框是否出现。
- 使对话框无模式。我希望它们都是模态的。 (此外,我已经尝试将它们设为无模式;这无助于解决问题。)
- 仅用于任务对话框的解决方案。它也必须适用于常规消息框。
【问题讨论】:
-
解决问题的方法是使用进度对话框的窗口句柄作为任务对话框的父级。不幸的是,Ookii.Dialogs 目前没有公开该功能(主要是因为我在编写这个库时认为没有任何方法可以获取它;结果发现有一种未记录的方法)。
-
@Sven
:)很高兴收到您的来信!!我可以在自己的源代码中应用这种未记录的方式来获取进度对话框的窗口句柄吗?还是您必须在 Ookii.Dialogs 本身中使用它才能将句柄暴露给我?另外,你想尽快做吗?谢谢! -
您需要修改 Ookii.Dialogs 源代码。我会考虑进行这些修改。
-
在实施该解决方案时还有一个问题。
MessageBox.Show方法以及TaskDialog需要一个Window实例作为它们的父对象。我可以检索并公开进度对话框的窗口句柄,但我永远无法将其变成Window。我当然可以更改 TaskDialog 以接受非Window父级,但这对于MessageBox是不可能的。 -
嗯,进度对话框的窗口句柄的类型是什么?为什么不能是
Window或转换为Window?如果您能给我一个您将要使用的未记录方式的链接(如果有的话),那就太好了。谢谢@Sven
标签: wpf c#-4.0 modal-dialog