从 MDI 切换到 SDI 并再次切换回来

Posted

技术标签:

【中文标题】从 MDI 切换到 SDI 并再次切换回来【英文标题】:Switching from MDI to SDI and Back Again 【发布时间】:2009-11-16 22:20:51 【问题描述】:

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

我的 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 容器。 o_O

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

之前有没有人在 .NET 中实现过这种行为?你是怎么做到的?我在这里想念什么?哈!

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

大声笑——你是对的。这是一个蹩脚的答案。 :0) 但问题就在这里。对于这种特殊的类型应用程序,有时 MDI 非常有用,有时突破 MDI非常有用(多显示器设置浮现在脑海)。想想一个数据库浏览器。 只是出于好奇,我想知道为什么这是不可取的。是因为用户无法处理它,还是因为工具/操作系统/其他什么问题?如果是用户问题,我认为这不是问题。我的目标受众不会是不知道如何在 MDI 和 SDI 之间切换的用户。 @Mike - 我挖了很多试图找出为什么不建议这样做,因为我遇到了 MDI 窗口的问题。不过,我永远找不到一个像样的答案。同时,我的问题是因为一个与 MDI 完全无关的愚蠢遗漏。

以上是关于从 MDI 切换到 SDI 并再次切换回来的主要内容,如果未能解决你的问题,请参考以下文章

我的 SQL 进程不断从“暂停”切换到“运行”并再次返回

WIN7怎样从普通用户切换到管理员用户

在 OS X 上从 zsh 切换到 bash,然后再切换回来?

用户切换浏览器选项卡时如何从 JApplet 中隐藏 JDialog?

怎么用js点击按钮改变网页主题,就是把颜色换一下,再次点击在换回来,就这样点击来回切换?

如果我编辑另一个工作表并切换回来,则不显示易失性 UDF 的结果