从MDI切换到SDI再返回

时间:2009-11-16 22:20:52

标签: c# .net user-interface mdi

这听起来像是一项简单的任务,但我遇到了一些问题。

我的C#应用​​程序有一些相当简单的代码:

    private void SwitchToSdi()
    {
        MainWindow mainWindow = GetMainWindow();

        for (int index = mainWindow.MdiChildren.Length - 1; index >= 0; index--)
        {
            Form form = mainWindow.MdiChildren[index];
            if (!(form is MainWindow))
            {                    
                form.Visible = false;
                form.MdiParent = null;
                form.Visible = true;
                mainWindow.MdiChildren[index] = null;
            }
        }
        mainWindow.IsMdiContainer = false;
    }

然后,

    private void SwitchToMdi()
    {
        MainWindow mainWindow = GetMainWindow();
        mainWindow.IsMdiContainer = true;
        for (int index = Application.OpenForms.Count - 1; index >= 0; index--)
        {
            Form form = Application.OpenForms[index];
            if (!(form is MainWindow))
            {
                form.Visible = false;
                form.MdiParent = mainWindow;
                form.Visible = true;
            }
        }
    }

请注意,MainWindow是一个MDI父窗口,其IsMdiContainer属性设置为True。

用户可以在“选项”对话框中在MDI和SDI之间切换。这很有效。如果我切换到SDI,新窗口会在主窗口外打开,这很棒。同样,如果我切换到MDI,它们会在容器内部打开。

但是,我注意到了一些事情。

  1. 打开MDI子窗口不会像我预期的那样成为SDI窗口。

  2. 打开SDI窗口不会像我预期的那样成为MDI子窗口。

  3. 即使我在调用SwitchToMdi()后将IsMdiContainer设置为true,如果我尝试打开一个新窗口,我会得到一个异常,告诉我主窗口不是MDI容器。 O_O

  4. 有人请在这里给我一个骨头。这不应该是火箭科学。但是我没有在Intarwebs上找到很多有用的帮助(阅读:g00gle相当无用)。

    以前有没有人在.NET中实际实现过这种行为?你是如何实现的?我在这里错过了什么? HALP!

2 个答案:

答案 0 :(得分:1)

不得不说我之前没有那样做,只是遇到同样的问题。为了提供解决方案,我目前的想法是你可以通过“复制”表单的状态来模仿所需的行为。创建一个新实例并将状态传递给构造函数。

答案 1 :(得分:0)

这是一个蹩脚的答案,但你已经18个小时没有了,所以这里......

在Borland / Embarcadero C ++ Builder帮助中,它说“不建议在运行时更改FormStyle [在SDI和MDI之间]”。