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

时间:2012-01-02 20:27:19

标签: c# winforms modal-dialog

我试图在模态形式最小化时使所有者形式最小化。但是当我最小化模态形式时 - 它完全消失了。 ( - 我可以点击所有者表格。)

我该如何解决这个问题?

我有:

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 form doesn't appear in tray until minimized and owner-form is clicked once. How do I make it appear?

5 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

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

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

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

public partial class Form1 : Form
{
    Form2 frm2 = new Form2();

    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        frm2.ShowDialog(this);
    }
}

我希望这会有所帮助。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

添加:

Show();

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

答案 4 :(得分:0)

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

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();
    }
}