【发布时间】:2016-06-15 16:58:59
【问题描述】:
正如标题所说,我有一个 WinForms 窗口,它有时会在调用 ShowDialog 后立即将其 DialogResult 属性设置为 Cancel。
窗口显示如下:
bool isSuccess = (ShowDialog() == System.Windows.Forms.DialogResult.OK);
现在大多数时候,DialogResult 在第一次实例化窗口时设置为None,这是应该的。在这些情况下,窗口将保持打开/活动状态,直到 DialogResult 设置为 None 以外的其他值。
我什至把这个函数改成这样:
this.DialogResult = System.Windows.Forms.DialogResult.None;
bool isSuccess = (ShowDialog() == System.Windows.Forms.DialogResult.OK);
但有时,DialogResult 会立即变为Cancel。
我的代码中没有任何地方在任何地方、任何时间设置或与DialogResult 属性交互,当它自动设置为Cancel 时。
此外,如果我在调用 ShowDialog 后立即中断行,则导致 ShowDialog 调用的整个堆栈跟踪相同 - 逐行。
鉴于实际上没有任何东西与 DialogResult 属性交互,我完全不知道如何阻止它。
【问题讨论】:
-
为 FormClosing 事件添加事件处理程序并在其上设置断点。堆栈跟踪可能会给出提示。请记住,如果您将其隐藏或它的所有者窗口消失,对话框总是会在没有您帮助的情况下自动关闭。
-
您可以将 ShowDialog 与重载一起使用,该重载将您希望成为其所有者的表单作为参数,并查看您是否有相同的行为
-
我将测试 FormClosing 事件的样子,但重现该行为可能需要一些时间,因为它仅发生大约 10% 的时间。在任何人问之前,不,10% 或任何 % 的时间都没有什么不同。
-
我们只是在玩猜谜游戏。如果您需要更多帮助,请提供minimal verifiable example。没有这个,这真的不是一个可以回答的问题。我相信我们大多数从事 Windows 窗体开发多年的人都可以证明它不会自行随机更改。您的代码在某些地方还有更多我们没有在这里看到的地方。
-
@Justin,这里只有两个选项。要么你的代码是错误的,你只是因为没有共享足够多的代码来让任何人帮助你而变得不可能,或者微软最受欢迎的库之一拒绝只使用你正确编写的代码。您似乎确信这是第二种选择,在这种情况下,您对这里的任何人有什么期望?您是否希望有人为您向 Microsoft 报告错误?