私のwpfアプリケーションでは、UIがユーザーに応答するように、ボタンクリックイベントを別のスレッドとして作成し、バックグラウンドプロセスとして実行しました。以下のようなコード、
private void btn_convert_Click(object sender, RoutedEventArgs e)
{
//Makes the conversion process as background task which
//makes the UI responsive to the user.
Thread thread = new Thread(new ThreadStart(WorkerMethod));
thread.SetApartmentState(ApartmentState.MTA);
thread.IsBackground = true;
thread.Start();
}
WorkerMethod では、ユーザーに別のウィンドウを提供しているファイル名を変更するオプションがあります。このアクションでは、以下のように Dispatcher メソッドを使用しています。
if (MessageBox.Show("Do you want to set filename?",
"Information", MessageBoxButton.YesNo, MessageBoxImage.Asterisk) ==
MessageBoxResult.Yes)
{
Action showOutput = () =>
{
BlueBeamConversion.SetOutput _setOutput =
new BlueBeamConversion.SetOutput();
_setOutput.ShowDialog();
};
Dispatcher.BeginInvoke(showOutput);
if (String.IsNullOrEmpty(MainWindow.destinationFileName))
return;
ここで、destinationFileName は SetOutput ウィンドウで設定されます。上記のコードを実行すると SetOutput ウィンドウが表示され、ファイル名を設定するまで待機しません。ファイル名を設定する前に、以下のコードになります。
if (String.IsNullOrEmpty(MainWindow.destinationFileName))
return;
setoutputウィンドウで[OK]ボタンをクリックするまでどうすれば保持できますか。どんな提案でも大歓迎です。
BeginInvoke の代わりに、dispatcher.Invoke を使用しました。これでウィンドウが保持され、新しい名前が付けられます。ただし、workmethod のコードを特定の行で継続すると、アプリケーション自体が終了します。以下のコードを修正してください。
if (MessageBox.Show("Do you want to set filename?", "Information", MessageBoxButton.YesNo, MessageBoxImage.Asterisk) == MessageBoxResult.Yes)
{
Action showOutput = () =>
{ BlueBeamConversion.SetOutput _setOutput = new BlueBeamConversion.SetOutput(); _setOutput.ShowDialog(); };
Dispatcher.Invoke(showOutput);
for (int i = 0; i < _listFiles.Items.Count; i++)--- here it exits
{--------- }
よろしくサンギータ