为什么模态forms在最小化时会完全消失?

当模态forms最小化时,我试图让所有者forms最小化。 但是当我最小化模态forms时 – 它完全消失了。 ( – 我可以点击所有者表格。)

我该如何解决这个问题?

我有:

public partial class Form1 : Form { Form2 frm2 = new Form2(); public Form1() { InitializeComponent(); frm2.Owner = this; } private void button1_Click(object sender, EventArgs e) { frm2.ShowDialog(); } } 

和:

 class Form2 : Form { Form1 frm1; FormWindowState ws = new FormWindowState(); public Form2() { SizeChanged += new EventHandler(Form2_SizeChanged); } void Form2_SizeChanged(object sender, EventArgs e) { frm1 = (Form1)Owner; if (WindowState == FormWindowState.Minimized) { ws = frm1.WindowState; frm1.WindowState = FormWindowState.Minimized; } else frm1.WindowState = ws; } } 

(尝试此操作时,我也遇到了这样的问题: Modal表单在最小化之前不会出现在托盘中,并且单击所有者表单一次。如何使其显示? )

这是设计的。 作为模态合同的一部分,显示一个对话框会禁用应用程序中的所有其他窗口。 当用户最小化对话窗口时,没有用户可以访问的窗口。 使应用程序无法使用。 Winforms确保在最小化时自动关闭对话框不会发生这种情况。

显然,你会想要防止这种情况发生。 将MinimizeBox属性设置为false。 MaximizeBox属性也应该设置为false,使两个按钮从窗口标题中消失。 为HelpButton留出空间。

我不记得每个需要这么多代码才能让模态Windows工作。 我对您的评论“我可以点击所有者表单”感到担心,这让我相信表单没有被正确设置为模态。 通过定义,必须在用户控制返回所有者表单之前处理模态表单。 Minimizinfg模态forms并不构成对模态forms的正确“处理”。

这是我过去使用的一些代码。 注意:在ShowDialog中将所有者作为参数传递可建立所有权关系。 虽然我怀疑你的代码是有效的,但我并没有这样使用它。

另外,当我这样做时,我没有在模态窗体中放置任何特殊代码,并且还禁用了窗体右上角的所有按钮; 从而确保用户不能在我提供的任何按钮之外关闭,最小化或最大化模态forms。

 public partial class Form1 : Form { Form2 frm2 = new Form2(); public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { frm2.ShowDialog(this); } } 

我希望这有帮助。

表单有一个属性ShowInTaskbar 。 如果将其设置为false则表单将永远不会出现在任务栏上,即使最小化也是如此。

添加一个:

 Show(); 

在Form2的事件处理程序结束时。

我还有一个要求,即在最小化对话框forms时它应该最小化应用程序,并且在恢复应用程序时它应该再次显示对话框。 这是我做的:

MainForm.cs

 public partial class MainForm : Form { public MainForm() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Form2.Show(this, "Testing 123"); } } 

Form2.cs

 public partial class Form2 : Form { bool isMinimized; private Form2() { InitializeComponent(); ShowInTaskbar = false; } private void Form2_FormClosed(object sender, FormClosedEventArgs e) { if (Owner != null) { Owner.Enabled = true; } } private void Form2_Load(object sender, EventArgs e) { MinimizeBox = Owner != null; if (Owner != null) { Owner.Enabled = false; } } private void Form2_SizeChanged(object sender, EventArgs e) { if (Owner != null) { if (WindowState == FormWindowState.Minimized && Owner.WindowState != FormWindowState.Minimized) { Owner.Enabled = true; Owner.WindowState = FormWindowState.Minimized; isMinimized = true; } else if (isMinimized && Owner.WindowState != FormWindowState.Minimized) { Owner.Enabled = false; } } } public static void Show(Form owner, string message) { var form2 = new Form2(); form2.label1.Text = message; if (owner != null) form2.Show(owner); else form2.ShowDialog(); } }