2

これは非常に大規模なプロジェクトであることが判明しており、クラスから他のフォームのオブジェクトにアクセスする必要があることが多いため、最初に、Windows フォームであるタイプ「MainForm」の program.cs クラスに静的変数を作成します。

DataManger.cs クラスから、オブジェクト 'Program.MainFormObj = new MainForm()' をインスタンス化し、Show メソッドを呼び出してフォームを表示します。フォームの Paint イベントが終了していないように見えましたが、一部のコントロールが描画されると開始されます。おそらく、メイン スレッド (これはすべて 1 つのメイン スレッドで実行されています) が次のステートメントによって「占有」されているためです。私は、既知の問題に関係なく、 Application.DoEvents() を使用して一時的にこの問題に対抗すると考えました。私が想像したように、それは機能しましたが、ある程度しか機能しませんでした. MessageBox.Show() のようなブロッキング メソッドを配置すると、完全に完璧なフォームをバックグラウンドで表示できますが、[OK] を押すとすぐにアプリケーション全体が終了します。

私は本当に立ち往生しています。こことGoogleの両方を使用して広範な検索を行ったにもかかわらず、適切な答えが見つかりません。私はこのスレッドを実行しました: Form.Show() は子コントロールを表示していませんが、指定されたソリューションは私のソリューションには適していません。どんな助けでも大歓迎です、ありがとう。

4

1 に答える 1

2

これが大規模なプロジェクトである場合は、今すぐ時間をかけてリファクタリングしてください。

  • MVC パターンを考えてみましょう。新しい UI テクノロジだけでなく、WinFormsでできること。
  • WinForms を選択しない場合は、少なくとも UI とデータを分離してください (データ バインディングはあなたの味方です)。
  • 異なるフォームが共通の機能を共有する場合、再利用可能なコンポーネントを構築します。

WinForms の動作方法と戦うことは、正しいことを行うために今時間を投資するよりも、中期的にははるかに費用がかかります。

テクノロジについて選択肢がある場合は、代わりに WPF を検討してください。WPF には学習曲線がありますが、その学習に今すぐ投資する価値があるかもしれません。

アップデート

コード サンプルに基づいて、おそらくメイン UI スレッド以外のスレッドでいくつかのフォームを作成していることがわかります。それは許可されていますが、フォームはフォームが作成されたスレッドからしか更新できないため、非常に紛らわしいコードが作成されます。

これを機能させるための最も簡単なハックは、メイン UI スレッドでHandleIncomingDataも呼び出しを呼び出すように更新することです。Show()

ここに概説されている静的メソッドからそれをきれいに行う方法があるはずです:

https://stackoverflow.com/a/505361/141172

SynchronizationContextしかし、それを試してみると、常に nullであることがわかりました。私はちょうど一歩を逃していると確信しています。

を誤用することで、物事を機能させることができましたLoginForm(フォームが常に利用可能であると仮定して、おそらく間違っています。そうでない場合は、スレッドマーシャリング専用の特別なフォームを作成してください)。

ハックは次のようになります。

Program.MainForm = new MainForm();
try
{

    MessageBox.Show("Login Success.", "Login", MessageBoxButtons.OK, MessageBoxIcon.Information);

            // Abusing LoginForm's Invoke method.  Code assumes LoginForm is always available.
    Program.LoginForm.Invoke((MethodInvoker)delegate
    {
        Program.MainForm.Show();
    });


}
catch (Exception Ex)
{
    MessageBox.Show(Ex.ToString()); //Debuging purposes
}

ところで、非 UI スレッドから UI コードを簡単に呼び出すことができる優れた拡張メソッドがあります。

https://stackoverflow.com/a/3588137/141172

于 2012-07-04T00:14:18.913 に答える