【发布时间】:2020-06-26 02:55:50
【问题描述】:
早安,
我想检查是否有人可以帮助解决我遇到的以下问题。我有一个使用ShowDialog(this) 显示的子表单,并且我正在注册Resize 事件,以便我可以与孩子一起更改父母的状态。问题是当父窗体最小化时,子窗体关闭。我已经确定父级中的WindowState = FormWindowState.Minimized 调用导致using 语句通过ShowDialog(IWin32Window) 的阻塞调用,但我不明白当只有子级最小化时(然后父级无法获得焦点) ,阻塞调用没有通过。我该如何解决这种行为?最好不要持有对子窗口的引用,并在每次父的WindowState 更改时检查它。
我的代码:
private void StockTakeHistoryMenu_Click(object sender, EventArgs e)
{
using (StockTakeWindow window = new StockTakeWindow())
{
window.Resize += this.ChildStateChanging;
window.ShowDialog(this);
window.Resize -= this.ChildStateChanging;
}
}
private void ChildStateChanging(object sender, EventArgs e)
{
switch ((sender as Form).WindowState)
{
case FormWindowState.Normal:
this.WindowState = FormWindowState.Normal;
break;
case FormWindowState.Minimized:
this.WindowState = FormWindowState.Minimized;
break;
case FormWindowState.Maximized:
this.WindowState = FormWindowState.Maximized;
break;
}
}
【问题讨论】:
-
不能阻止child关闭,必须阻止parent最小化。用户无法执行此操作,父级已禁用,因此您必须在代码中找到执行此操作的语句。也许是在 ChildStateChanging() 中,你必须确保子窗口不允许用户最小化它。将其 MinimizeBox 属性设置为 False。
-
并考虑是否真的需要 ShowDialog()。您不使用它的返回值,不使用 using 并且不检索对话框属性,因此它看起来不像它。您更喜欢使用 Show(),通过 FormClosing 事件知道窗口即将关闭。
-
@HansPassant 我不使用 DialogResult,是的,并且 using 和 ChildStateChanging 是根据需要实现的。事情是当孩子最小化时我想最小化父母。当用户最小化孩子时,我想允许父母也被最小化,这样即使父母被禁用,他们也可以在表单后面工作,因为当 ShowDialog 仍处于活动状态时,您无法单击最小化
标签: c# winforms desktop-application