6

ShowDialogバックグラウンド スレッドから強制的に戻るにはどうすればよいですか?

フレームワークによって送信されたメッセージをリッスンしている C++/CLR フレームワークの上に構築された WPF アプリケーションがあります。1 つの特定のメッセージが非常に重要であるため、現在のウィンドウをすべて閉じる必要があります。Dialogただし、 (メイン ウィンドウから作成された) モーダルShowDialogがアクティブで、ユーザーの入力を待っている場合、ウィンドウはShowDialog戻るのを待っているため、閉じません。Dialogモーダルを強制的に閉じてコード実行を巻き戻すにはどうすればよいですか?

DialogResultまたは を設定しようとしましたCloseが、うまくいかないようです。

編集:次のDialogように、戻り値を期待するメインウィンドウによって作成されます:(のクリックイベントハンドラー内MainWindow):

Window modalDialog = new Window();
bool ret = (bool)modalDialog.ShowDialog();
if (ret == true)
{
 // do stuff
}
else
{
 // do some other stuff
}

フレームワークがメッセージを送信する (UI スレッドとは別のスレッドで受信する) ときは、 を呼び出しますMainWindow.Close()。この時点でモーダル ダイアログは閉じられますが、Dialog(after ShowDialog) の戻り値をチェックするコードはまだスタックにあります。どういうわけか、これによりメインウィンドウが消えなくなります。

4

3 に答える 3

1

ShowDialog を強制的に返すことはできませんが、ウィンドウを閉じるように指示できるフレームワークから送信されたイベントをリッスンすることができます。以下の例では、Progress イベントに「Done」フラグがあり、完了時にウィンドウを閉じます。

SomeGenerator IG = Manager.SomeGenerator();
SomeWindow PP = new SomeWindow();
IG.ProgressEvent += PP.ProgressEvent;
IG.ExecuteAsync();            
PP.ShowDialog();
于 2010-01-09T02:15:36.627 に答える
0

私は、いつでも ShowDialog を強制的に返して実行を継続させることはできないことに気付きました。フレームワークから受信した要求のイベント ハンドラーは、コンテキストから外れる必要があるため、コール スタックをアンワインドし、モーダル ダイアログで Close メッセージを処理できます。

最終的にブール値フラグを設定し、モーダルを閉じるように要求してから、フレームワーク イベント ハンドラーから戻りました。この時点でのみ ShowDialog が返され、設定したフラグを確認して、要求されたアクションを続行できます。

于 2010-01-12T23:15:17.187 に答える