C# 从MDI切换到SDI并再次切换

C# 从MDI切换到SDI并再次切换,c#,.net,user-interface,mdi,C#,.net,User Interface,Mdi,这听起来似乎是一项简单的任务,但我遇到了一些问题 我的C#应用程序有一些相当简单的代码: private void SwitchToSdi() { MainWindow mainWindow = GetMainWindow(); for (int index = mainWindow.MdiChildren.Length - 1; index >= 0; index--) { Form form =

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

我的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,它们会在容器内部打开

然而,我注意到了一些事情

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

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

  • 即使在调用SwitchToMdi()时将IsMdiContainer设置为true之后,如果我尝试打开一个新窗口,也会出现一个异常,告诉我主窗口不是MDI容器。欧欧欧

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


    以前有人在.NET中实现过这种行为吗?你是怎么做到的?我错过了什么?停

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


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

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

    LOL——你说得对。那是一个蹩脚的回答但问题是。对于这种特殊类型的应用程序,有时MDI非常有用,有时中断MDI非常有用(想到多个监视器设置)。想一想数据库浏览器。只是出于好奇,我想知道为什么它不可取。是因为用户无法处理它,还是因为工具/OS/什么的问题?如果这是一个用户问题,我不认为这是一个问题。我的目标受众不会是那些不知道如何在MDI和SDI之间交换的用户。@Mike-我四处寻找,试图找出为什么不建议这样做,因为我的MDI窗口有问题。但是我从来没有找到一个像样的答案。同时,我的问题是因为一个愚蠢的遗漏,它与MDI完全无关。