从 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 并再次切换回来的主要内容,如果未能解决你的问题,请参考以下文章
在 OS X 上从 zsh 切换到 bash,然后再切换回来?
用户切换浏览器选项卡时如何从 JApplet 中隐藏 JDialog?