【发布时间】:2016-04-25 17:34:58
【问题描述】:
背景:
我正在使用 C# 4.0 和 VS2013 创建一个 WinForms 应用程序。我的应用程序有一个名为ParentForm 的主窗体和一个名为ChildForm 的辅助窗体。该应用程序遵循 Model-View-Presenter 设计,因此我希望我的演示者类 P 控制所有表单打开、关闭、按钮单击以及用户请求的任何内容。 (这两种形式实际上都是在“视图”接口后面抽象出来的,但问题出在 WinForms 实现上,所以让我们忽略这些接口。)
问题:
目前P 正在处理ParentForm 和ChildForm 的FormClosing 事件,如果确定允许用户关闭这些表单,则调用Form.Close 或Form.Dispose。
我遇到的问题是ChildForm 是否打开并且用户单击ParentForm 上的“X”按钮。在这种情况下,首先在 ChildForm 上调用 FormClosing,然后在 ParentForm 上调用。 P 无法知道用户是否点击了ChildForm 上的“X”(P 应该通过关闭ChildForm 来做出反应),或者用户点击了ParentForm 上的“X”(其中P 应该在关闭任何表单之前确认用户是否真的想退出)。
问题:
有没有办法判断是否正在调用 FormClosing 以响应父表单关闭?
有没有办法将“X”按钮视为普通按钮?
有没有办法防止子表单在父表单的FormClosing 事件(以及可能的用户取消)之后关闭?
【问题讨论】:
-
请澄清术语“子表单” - 例如MdiChild,拥有形式还是?
e.CloseReason在一种或另一种情况下显示什么? -
@Ivan - 抱歉,我所说的“孩子”是指
ChildForm.Owner == ParentForm。我不知道e.CloseReason;这给了我我需要的所有信息。当用户试图关闭ChildForm时,它的CloseReason.UserClosing,当用户试图退出程序时,它的CloseReason.FormOwnerClosing。谢谢。 -
@Ivan - 作为答案发布,以便我接受。