当我关闭最大化的MDI子表单时没有任何反应

时间:2015-02-06 15:23:12

标签: c# winforms mdi mdichild maximize-window

我有Form1个2个单选按钮(rb1rb2)和一个普通按钮(btn)。当我点击btn时,我应该打开Form2,作为Form1的MDI孩子,如果rb1被选中,或者Dialog rb2 Form2检查。此外,任何时候都只能打开一个public partial class Form1 : Form { Form2 f2; public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { if (f2 != null) { MessageBox.Show("Close form!"); return; } f2 = new Form2(); if (radioButton1.Checked == true) { this.IsMdiContainer = true; f2.MdiParent = this; f2.Show(); } else { f2.Show(); } f2.FormClosed += f2_FormClosed; } void f2_FormClosed(object sender, FormClosedEventArgs e) { this.IsMdiContainer = false; f2 = null; } }

这是我的代码:

Form2

除非我将Form2最大化为MDI子项然后将其关闭,否则一切都会正常工作。在该屏幕保持不变之后(因为我甚至没有关闭Form2)但我可以打开新的Form1,然后Form1 - [Form2]的标题为“Form1 - [Form2] - [Form2] “,如果我重复这个过程,那就是”f2_FormClosed“等等。

我发现我的 void f2_FormClosed(object sender, FormClosedEventArgs e) { f2.Hide(); // <<<<<<<<-----------NEW this.IsMdiContainer = false; f2 = null; } 方法应该是

Form2

但我不知道为什么; {{1}}应该关闭,我不知道为什么要隐藏它?!

谢谢!

1 个答案:

答案 0 :(得分:0)

我同意Hans的观点,在运行时切换IsMdiContainer很不稳定,很可能会产生你还没见过的其他副作用。

认真考虑为您的应用设计不同的设计。

考虑到这一点,这可能是我整天发布的最愚蠢的黑客攻击:

public partial class Form1 : Form
{

    Form2 f2;
    System.Windows.Forms.Timer tmr = new System.Windows.Forms.Timer();

    public Form1()
    {
        InitializeComponent();
        tmr.Interval = 100;
        tmr.Enabled = false;
        tmr.Tick += delegate (object sender, EventArgs e) {
            tmr.Stop();
            this.IsMdiContainer = false;
        };
    }

    private void button1_Click(object sender, EventArgs e)
    {
        if (f2 != null)
        {
            MessageBox.Show("Close form!");
            return;
        }

        f2 = new Form2();
        f2.FormClosed += delegate(object sender2, FormClosedEventArgs e2) { 
            f2 = null; 
        };    
        if (radioButton1.Checked == true)
        {
            this.IsMdiContainer = true;
            f2.FormClosed += delegate(object sender3, FormClosedEventArgs e3) { 
                tmr.Start();
            };    
            f2.MdiParent = this;
        }
        f2.Show();
    }

}

*我最初尝试调用调用来更改IsMdiContainer,但这不起作用,所以我切换到了Timer。有效的愚蠢。谨慎使用此解决方案......