【问题标题】:Switching from MDI to SDI and Back Again从 MDI 切换到 SDI 并再次切换回来
【发布时间】: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,它们会在容器内打开。

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

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

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

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

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

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

【问题讨论】:

    标签: c# .net user-interface mdi


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

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