问题:
有人见过从另一个模态对话框调用一个模态对话导致模态被撤消吗?
如果您想使用ShowDialog进行调用,以便返回结果,但没有模态(其他窗体仍有响应),您将如何做到这一点?(我们不想这么做……但如果有办法做到这一点,也许我们是无意中这么做的。)
详细信息:
我们实现了自己的"打印"对话框,该对话框中的按钮可显示标准的PrintDialog、标准的PageSetupDialog和标准的PrintPreviewDialog。打印都是用我们自己的PrintDocument类完成的,该类派生自标准PrintDocument类。所以,我们正在努力遵循标准做法。。。我们只是需要用户从一些额外的设置开始。
我们使用PrintDialog.ShowDialog(mainWindow)从菜单中调用打印对话框。当它出现时,它是正确的模式(所有其他窗口都没有响应…特别是那个mainWindow)。在"打印"对话框中,有一些按钮可以调用其他三个对话框中的每一个。。。所有这些都是用ShowDialog(ourPrintDialog)调用的,使第一个打印对话框成为其父对话框。在PrintDialog和PageSetupDialog的情况下,它们是模态的(mainWindow和ourPrintDialog以及所有其他窗口都没有响应)。当我们确定或取消这些时,它会返回到第一个打印对话框(ourPrintDialog),它仍然是模态的(没有其他窗口响应)。
然而,在标准PrintPreviewDialog的情况下,尽管我们以相同的方式调用它(ShowDialog将第一个对话框作为其父对话框),但它并不是完全模态的。我们的主窗口再次响应。因此,您可以开始操作"打印"对话框正在打印的基础文档。。。这当然违背了许多假设。当您关闭"预览"对话框,返回到原始的"打印"对话框时,它现在也不处于模式状态。。。主窗口仍在响应。
我们在一个简单的测试应用程序中尝试过这样做,它运行良好。。。进入PrintPreviewDialog时,模态不会中断。因此,PrintPreviewDialog(因为其他两个应用程序不会发生这种情况)和我们的应用程序主窗口(因为测试应用程序不会出现这种情况)之间似乎有一些特定的交互。有什么建议吗?(因此我提出了上述两个问题。)
提前感谢您的任何建议!
不确定为什么会发生这种情况,但您可以尝试在窗口上运行Spy++并观察消息流,这可能会为您提供窗口之间发生的事情或相关窗口属性的线索。