0

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

我的 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 中实现过这种行为?你是怎么做到的?我在这里想念什么?哈!

4

2 回答 2

1

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

于 2010-08-04T07:27:50.277 回答
0

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

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

于 2009-11-17T16:44:06.197 回答