如何保持“form.ShowDialog()”的“this.ShowInTaskBar”同时保持打开状态?

如果您运行此代码片段(将其放在form1中)在一个包含2个表单的全新winform应用程序中

private void Form1_Load(object sender, EventArgs e) { Form2 newForm = new Form2(); Button b = new Button(); newForm.Controls.Add(b); b.Click += new EventHandler(click); this.Show(); newForm.ShowDialog(); } private void click(object sender, EventArgs e) { ((Form)((Control)sender).Parent).ShowInTaskbar = false; } 

然后单击新表单上的按钮(应该是form2),form2将关闭。

如何保持开放?

这不可能。 我实际上在微软的反馈网站上提交了一个关于它的错误报告 ,但是他们把它上面的鸟儿翻了个身。

不可否认,这是一个棘手的问题需要解决,更改属性需要Windows窗体从头开始重新创建窗口,因为它由样式标志控制。 您只能使用dwExStyle参数在CreateWindowEx()调用中指定的类型。 根据ShowDialog()方法调用的要求,重新创建窗口会使其难以保持模态。

Windows窗体适用于许多User32限制。 但不是那个。

在ShowDialog()之前,通过将ShowInTaskbar设置为false来保持打开状态;

 private void Form1_Load(object sender, EventArgs e) { Form2 newForm = new Form2(); Button b = new Button(); newForm.Controls.Add(b); b.Click += new EventHandler(click); this.Show(); // add this line of code... newForm.ShowInTaskbar = false; newForm.ShowDialog(); } private void click(object sender, EventArgs e) { ((Form)((Control)sender).Parent).ShowInTaskbar = false; } 

或者只是不要制作第二种forms模态。 这也有效。

 private void Form1_Load(object sender, EventArgs e) { Form2 newForm = new Form2(); Button b = new Button(); newForm.Controls.Add(b); b.Click += new EventHandler(click); this.Show(); newForm.Show(); } 

我不知道这里的具体机制,但显然正在发生的是更改标志(实际上改变了一个或多个WS_EX_xxx窗口样式)导致ShowDialog()的模态泵退出。 这反过来导致你(最终!)退出Form1_Load然后你的newForm超出范围并被销毁。

所以你的问题是ShowDialog()的一个组合,以及你没有准备好让ShowDialog()永远退出。

现在一个模态不应该首先显示任务栏图标,应该只有一个应用程序的任务栏图标和所有模式forms,因为当一个模态窗体运行时,主窗体无论如何都被禁用。 当主窗体最小化时,它拥有的所有模态窗体都将被隐藏,等等。

因此,如果您真的希望第二种forms是模态的,则不应该让用户能够为其提供任务栏图标。 如果使用ShowDialog()只是测试代码,那么不要担心它。 当表单在主应用程序泵上运行时,问题将消失。

你的问题对我来说不是很清楚。 无论如何, newForm表单显示为模式对话框,这意味着它阻止用户使用父表单直到它关闭。 modal dialog通常有一些按钮可以自动关闭它们,返回OKCancel调用表单(作为ShowDialog的返回值)。 这是使用DialogResult属性完成的,因此如果为您的按钮设置了此属性,这可能是您单击模式窗体时关闭的原因。

如果要以允许用户同时使用它们的方式显示更多表单,则需要使用无模式对话框。 这是关于MSDN的一篇很好的概述文章 。

怎么……我…这是一个丑陋的黑客

这项工作

  private void Form1_Load(object sender, EventArgs e) { Form2 newForm = new Form2(); Button b = new Button(); newForm.Controls.Add(b); b.Click += new EventHandler(click); newForm.FormClosed += new FormClosedEventHandler(form2_closed); newForm.FormClosing += new FormClosingEventHandler(form2_closing); this.Show(); do { newForm.ShowDialog(); } while (newForm.IsDisposed == false ); } private void click(object sender, EventArgs e) { ((Form)((Control)sender).Parent).ShowInTaskbar = !((Form)((Control)sender).Parent).ShowInTaskbar; } private void form2_closed(object sender, FormClosedEventArgs e) { ((Form)sender).Dispose(); } private void form2_closing(object sender, FormClosingEventArgs e) { if (e.CloseReason == CloseReason.None) e.Cancel = true; }