我有程序打开它内部的子窗口(mdi.parent)。我已经在其下的一个窗口中创建了组件,但是,我希望该窗口在创建之后从未实际处理过,因为我只想保留它的一个实例。
这可以通过代码来实现:
// This prevents this window disposing from window close button, we want always show one and only
// one instance of this window.
FormClosing += (o, e) =>
{
Hide();
e.Cancel = true;
};
然而,在此之后出现问题,关闭程序需要按两次关闭按钮。首先关闭子窗口,然后第二个终止程序。如何解决这个问题?
我正在与Winforms合作。
答案 0 :(得分:2)
正如Habib所说,你可以致电Application.Exit
,但是:
Form.Closed和Form.Closing事件不会引发 调用Application.Exit方法退出应用程序
如果这对您很重要,您可以执行以下操作(MDI父代码):
private Boolean terminating;
protected override void OnClosing(CancelEventArgs e)
{
if (!terminating)
{
terminating = true;
Close();
}
base.OnClosing(e);
}
答案 1 :(得分:1)
答案 2 :(得分:0)
FormClosing
事件处理程序方法中的代码有点过于简洁。它的作用是阻止用户关闭表单,但正如您也注意到的那样,它阻止您以编程方式关闭表单。
通过测试每次引发事件时传递的CloseReason
property FormClosingEventArgs
的值,可以轻松解决这个问题。
这些将告诉您表单尝试关闭的原因。如果值为CloseReason.UserClosing
,则您需要将e.Cancel
设置为true
并隐藏表单。如果值是其他值,那么您希望允许表单继续关闭。
// This prevents this window disposing when its close button is clicked by the
// user; we want always show one and only one instance of this window.
// But we still want to be able to close the form programmatically.
FormClosing += (o, e) =>
{
if (e.CloseReason == CloseReason.UserClosing)
{
Hide();
e.Cancel = true;
}
};
答案 3 :(得分:0)
使用此
Form[] ch = this.MdiChildren;
foreach (Form chfrm in ch)
chfrm.Close();
答案 4 :(得分:-1)
如果应用程序关闭时没有发生处理,您可以使用Application.Exit。否则,您可以在MDI父级的结束事件中检查Application.OpenForms
集合,并关闭所有其他已打开的表单。