質問

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

[私はその時に代替をコーディングしましたが、私はそれが好きではありません。より良いものが表示されない場合は、回答として投稿します]

EDIT:ダイアログはメインウィンドウの上に浮かびます。タスクバーに表示されるかどうかは気にしません。特定の状況では、複数のダイアログが同時にアクティブになる場合があります。

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

役に立ちましたか?

解決

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

他のヒント

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

  • 通知だけが必要な場合は、バルーンヒント(TNAまたは独自のもの)、またはOutlookメール通知またはTrillianディスプレイのような多くのインスタントメッセンジャーのようなウィンドウを試すことができます。
  • ユーザーに行動の機会を与えたいだけの場合は、非モーダルフォームを使用しますが、クリックするだけでよいことを忘れないでください。
  • ユーザーがメッセージに基づいて行動する必要がある場合は、モーダルにする必要があります。所有者ウィンドウはまだペイントされており、GUIを更新できることに注意してください。モーダルダイアログには、結局のところ、メッセージポンプがあります。そうしないと機能しません。最近そのようなことをしました。GUIを更新するためのアクションと起動イベントを実行するバックグラウンドワーカースレッドプールと、メッセージポンプを取得するモーダル待機ダイアログがありました。所有者ウィンドウは、期待どおりバックグラウンドアクションで更新されました。

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

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

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

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

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

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

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top