0

かなり大きな C# Forms アプリケーションがあります。多くの MdiChilds を制御する MdiParent があります。また、読み込みに時間がかかるフォームをユーザーが開いたときに常に一番上にジャンプする「読み込み画面」も作成しました。

問題は、例外がある場合、通常、キャッチで Messagebox.Show(ErrorNumber) のようなものを使用して、ユーザーが何が起こったのかを知ることです。ロード画面がオンのときにメッセージ ボックスが表示されると、クリックできません。

これを微調整したいと思います。MessageBox が表示されるたびにコードを実行するように、MdiParent (または、一度だけであれば別の場所) に関数を配置する方法はありますか? このようにして、読み込み画面を閉じる関数を簡単に呼び出すことができます。おそらく他にも解決策があると思いますが、ウィンドウ ハンドルやフックなどについて詳しく知りたいです。

4

2 に答える 2

1

これはひどい考えだと思います。私見ですが、そのようなブードゥー教を実践する代わりに、実際の問題、つまり例外の処理方法を修正する必要があります。修正されたコードは次のようになります。

catch(Exception ex)
{
    CloseLoadingScreen();
    MessageBox.Show(ErrorNumber);
}

つまり、ウィンドウフックなどを自由に探索できますが、悪い機会を選んだだけです。

編集:コードをリファクタリングする適切な方法は、重要なことをユーザーに通知することだけを目的としたエンティティを実装することだと思います。このエンティティは、読み込み画面の状態やその他の関連するものについての知識を持ち、このコンテキストに応じて一連のアクションを実行します (メッセージ ボックスを表示する、ログに書き込む、読み込み画面を閉じるなど)。その後、通知を送信する必要があるときはいつでもこのエンティティを使用できます。これにより、通知ロジックを変更するたびにすべての catch ステートメントを実行する必要がなくなります。簡単にアクセスできるようにシングルトンにすることができます。

于 2013-08-09T08:24:51.800 に答える
0

イベントにサブスクライブできますApplication.EnterThreadModal

これは、アプリケーションがモーダル状態に入ろうとするたびに発生します (たとえば、メッセージ ボックスを表示しようとしている場合など)。

Application.LeaveThreadModal対応するイベントもありますのでご注意ください。

于 2013-08-09T08:19:58.747 に答える