1

问题:

有没有人看到从另一个模态对话框调用一个模态对话框会导致模态被撤消?

如果您想使用 ShowDialog 进行调用以便返回结果,但没有它是模态的(其他表单仍然响应),您会怎么做?(我们并没有尝试这样做......但如果有办法做到这一点,也许我们是不小心这样做的。)

细节:

我们已经实现了我们自己的打印对话框,该对话框具有显示标准 PrintDialog、标准 PageSetupDialog 和标准 PrintPreviewDialog 的按钮。打印全部使用我们自己的 PrintDocument 类完成,该类派生自标准 PrintDocument 类。因此,我们正在尝试遵循标准实践……我们只有一些额外的设置需要用户开始使用。

我们使用我们的PrintDialog.ShowDialog(mainWindow) 从菜单调用我们的打印对话框。当它出现时,它是正确的模态(所有其他窗口都没有响应......特别是那个主窗口)。在该打印对话框中,有一些按钮可以调用其他三个对话框中的每一个...并且所有按钮都使用 ShowDialog(ourPrintDialog) 调用,从而将第一个打印对话框作为其父对话框。在 PrintDialog 和 PageSetupDialog 的情况下,它们出现模态(mainWindow 和 ourPrintDialog 以及所有其他窗口都没有响应)。当我们确定或取消这些时,它返回到第一个打印对话框(ourPrintDialog),它仍然是模态的(没有其他窗口响应)。

然而,在标准 PrintPreviewDialog 的情况下,尽管我们以相同的方式调用它(ShowDialog 以第一个对话框作为其父级),但它并不完全是模态的。我们的主窗口再次响应。因此,您可以开始操作“打印”对话框正在打印的基础文档……这当然违反了许多假设。当您关闭“预览”对话框,返回到原来的“打印”对话框时,它现在也不处于模态状态......主窗口仍在响应。

我们已经尝试在一个普通的测试应用程序中执行此操作,并且效果很好......进入 PrintPreviewDialog 时模式没有被破坏。所以,它似乎是 PrintPreviewDialog (因为它不会发生在其他两个)和我们的应用程序的主窗口(因为它不会发生在测试应用程序中)之间的一些特定交互。关于那可能是什么的任何建议?(因此我上面的两个问题。)

在此先感谢您的任何建议!

4

1 回答 1

0

不知道为什么会发生,但您可以尝试在窗口上运行 Spy++ 并观察流动的消息,可能会为您提供有关窗口之间发生的情况或相关窗口属性的线索。

于 2012-12-17T19:55:44.513 回答