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

誰かが私に骨をここに投げてください。これはロケット科学であってはなりません。しかし、私はInterrwebsで役立つヘルプをたくさん見つけていません(読んでください: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 に答える