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

时间:2010-03-06 00:58:11

标签: c# .net winforms

如果您将这段代码(放在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将关闭。

如何保持开放?

4 个答案:

答案 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表单显示为模式对话框,这意味着它阻止用户使用父表单直到它关闭。模态对话框通常有一些按钮可以自动关闭它们,将OKCancel返回到调用表单(作为返回值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;
    }