3

しばらく前に、通知のためにユーザーにメッセージ ボックスを表示する必要がある状況に遭遇しましたが、GUI スレッドをブロックするため、MessageBox.Show を使用できませんでした (ダイアログがアクティブな間、画面上の何も更新されません)。代替案はありますか?

[当時代替案をコーディングしましたが、気に入りません。何も良いものが表示されない場合は、回答として投稿します]

編集: ダイアログはメイン ウィンドウの上にフロートする必要があります。タスクバーに表示されるかどうかは気にしません。特定の状況では、一度に複数のダイアログがアクティブになる場合があります。

補遺: 私の解決策は、OK および CANCEL ボタンを提供して Completed および Canceled イベントを発行する基本フォームでした。OK は、サブクラスのオーバーライドのために仮想 ValidateData を呼び出しました。呼び出し元のフォームは、プロパティを使用して毎回フォームを再作成することを回避し (フォームは閉じずに非表示にするだけでした)、アクティブなフォームのディクショナリを保持して、同じフォームが複数回アクティブ化されるのを防ぎました。これはモーダル フォームのように見え、一度に複数のポップアップ フォームをサポートしますが、メインの GUI スレッドを拘束しません。

4

7 に答える 7

4

他の人が言ったように、非モーダルアプローチを使用することをお勧めしますが、もう少し具体的に:

  • 通知だけが必要な場合は、バルーン ヒント (TNA または独自のもの)、または Outlook メール通知のようなウィンドウ、または Trillian ディスプレイのような多くのインスタント メッセンジャーの通知を試すことができます。
  • ユーザーにアクションの機会を与えたいだけなら、非モーダル フォームを使用しますが、クリックするだけで離れてしまう可能性があることを覚えておいてください。
  • ユーザーがメッセージに従って行動しなければならない場合は、モーダルにする必要があります。オーナー ウィンドウは引き続き描画され、GUI を更新できることに注意してください。結局のところ、モーダル ダイアログにはメッセージ ポンプがあり、それ以外の場合は機能しません。私は最近、そのようなことをしました。任意のアクションを実行し、GUI を更新するためのイベントを発生させるバックグラウンド ワーカー スレッド プールと、メッセージ ポンプを引き続き取得するモーダル待機ダイアログがありました。オーナー ウィンドウは、期待どおりにバックグラウンド アクションで更新されました。
于 2008-10-13T20:49:42.343 に答える
4

rslite と Mitchel Sellers に同意します。必要な情報を表示する非モーダル フォームを作成するのが最善の方法です。複数のメッセージがある場合は、それらを ListBox に配置し、表示する必要がある完全な情報を取得するためにユーザーにそれらをダブルクリックさせることを検討してください。

于 2008-10-13T20:30:11.587 に答える
2

アプリケーションにNotifyIconを追加して、バルーン ヒントを表示するのはどうでしょうか。短所は、通知が短時間で消えることですが、ユーザーがアクションを実行する必要がない場合は、これが最善の方法かもしれません。

于 2010-05-14T18:18:43.070 に答える
1

提案に貢献してくれたすべての人に感謝します。私の解決策はほぼ正しかったようです;-)

私の解決策は、OK および CANCEL ボタンを提供して Completed および Canceled イベントを発行する基本フォームでした。OK は、サブクラスのオーバーライドのために仮想 ValidateData を呼び出しました。呼び出し元のフォームは、プロパティを使用して毎回フォームを再作成することを回避し (フォームは閉じずに非表示にするだけでした)、アクティブなフォームのディクショナリを保持して、同じフォームが複数回アクティブ化されるのを防ぎました。これはモーダル フォームのように見え、一度に複数のポップアップ フォームをサポートしますが、メインの GUI スレッドを拘束しません。

于 2008-11-13T05:22:57.387 に答える
1

特定の要件に応じて、非モーダル ダイアログ ボックスまたはツールチップを使用して、これを解決します。

于 2008-10-13T20:14:10.980 に答える
1

ブロックしたくない場合は、表示を行うための独自の単純なフォームを作成するだけです。これは、ノンブロッキング ソリューションが必要になる前に、クライアントのためにアイテムを完成させた方法です。ただし、ノンブロッキングで行うと、実際に「行動しなければならない」タイプのアイテムである場合、ユーザーが倍増して圧倒される可能性があることに注意してください。

于 2008-10-13T20:16:17.327 に答える
-1

MessageBox のルック アンド フィールが必要な場合は、バックグラウンド スレッドで表示するだけです。

ThreadPool.QueueUserWorkItem( (state) =>
    {
         MessageBox.Show("Your message");
    });

(コードはテストされていません)

于 2008-10-13T20:34:26.603 に答える