如果您将这段代码(放在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将关闭。
如何保持开放?
答案 0 :(得分:4)
这是不可能的。我实际上是在微软的反馈网站上提交了一个bug report,但是他们把它上面的鸟儿翻过来。
不可否认,这是一个棘手的问题需要解决,更改属性需要Windows Forms从头开始重新创建窗口,因为它是由样式标志控制的。您只能使用dwExStyle参数在CreateWindowEx()调用中指定的类型。根据ShowDialog()方法调用的要求,重新创建一个窗口很难保持模态。
Windows窗体适用于许多User32限制。但不是那个。
答案 1 :(得分:2)
在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;
}
或者只是不要制作第二种形式模态。这也有效。
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()永远退出。
现在一个模式不应该首先显示任务栏图标,应该只有一个应用程序的任务栏图标和所有它的模态形式,因为当一个模态表单正在运行,主表单无论如何都被禁用。当主窗体最小化时,它所拥有的所有模态窗体都将被隐藏等等。
因此,如果您确实希望第二种形式为模态,则不应让用户为其提供任务栏图标。如果使用ShowDialog()只是测试代码,那么不要担心它。当表单在主应用程序泵上运行时,问题就会消失。
答案 2 :(得分:0)
你的问题对我来说不是很清楚。无论如何,newForm
表单显示为模式对话框,这意味着它阻止用户使用父表单直到它关闭。模态对话框通常有一些按钮可以自动关闭它们,将OK
或Cancel
返回到调用表单(作为返回值ShowDialog
)。这是使用DialogResult
property完成的,因此如果为您的按钮设置了此属性,这可能是您单击模式窗体时关闭的原因。
如果要以允许用户同时使用它们的方式显示更多表单,则需要使用无模式对话框。这是good overview article on MSDN。
答案 3 :(得分:0)
怎么......我...这是一个丑陋的黑客
这项工作
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;
}