【问题标题】:Nothing happens when I close maximized MDI child form当我关闭最大化的 MDI 子窗体时没有任何反应
【发布时间】:2015-02-06 15:23:12
【问题描述】:

我有 Form1 和 2 个单选按钮(rb1rb2)和一个普通按钮(btn)。当我单击btn 时,我应该打开Form2,如果选中rb1,则作为Form1 的MDI 子级,或者如果选中rb2,则作为普通Dialog。另外,任何时候都只能打开一个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 最大化为MDI 子级然后关闭它,否则一切正常。之后屏幕保持不变(因为我什至没有关闭Form2)但我可以打开新的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应该被关闭,我不知道为什么要隐藏它?!

谢谢!

【问题讨论】:

  • 在创建窗口的窗体上更改 IsMdiContainer 属性有许多副作用。不要这样做。

标签: c# winforms mdi mdichild maximize-window


【解决方案1】:

我同意 Hans 的观点,在运行时切换 IsMdiContainer 很不可靠,并且可能会产生您尚未见过的其他副作用。

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

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

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。愚蠢的工作。谨慎使用此解决方案...

【讨论】:

    猜你喜欢
    • 2012-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多