これは簡単な作業のように聞こえますが、いくつかの問題が発生しています。
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
誰かが私に骨をここに投げてください。これはロケット科学であってはなりません。しかし、私はInterrwebsで役立つヘルプをたくさん見つけていません(読んでください:g00gleはかなり役に立たないです)。
誰かが実際にこの動作を.NETに実装したことがありますか?どのようにしてそれを達成しましたか?ここで何が欠けていますか?やめろ!