トップ回答者
別ウィンドウの表示について

質問
-
WPFアプリケーションから、処理状態を示すウィンドウを表示し、処理状況をそのウィンドウに随時反映しようとしています。
(ファイル移動中・残りxx/xxxのようなもの)
しかし、ウィンドウ内のコントロールの描画がされません。
<StackPanel HorizontalAlignment="Center" VerticalAlignment="Top" MaxWidth="200" MaxHeight="200"> <Label HorizontalAlignment="Center">写真データベースを構築しています。</Label> <TextBlock VerticalAlignment="Center" Text="{Binding Path=sProgress,Mode=OneWay}"/> </StackPanel>
上のようなウィンドウですが、ラベルの部分も描画されず、動的に動かすTextBlockの変化が終了した後に両方とも表示される感じです。
ウィンドウ作成側のコードは以下のような感じです(動作確認用のコードです)
DBProgressDialog temp = new DBProgressDialog(); DBBuildDialogData dlgData = new DBBuildDialogData(100); temp.DataContext = dlgData; temp.Show(); for (int i = 0; i < 10; i++) { dlgData.SetExecutedFileNum(i); System.Threading.Thread.Sleep(1000); }
SetExecutedFileNum()はTextBlockにバインドされている文字列を更新するメソッドです。INotifyPropertyChangedのインタフェースも実装されています。
つまらないミスをしている気がするのですが、よろしくお願いします。
回答
-
メインスレッドで処理しててはいけません。描画もメインスレッドで行っているので、重い処理でスレッドを占有している間は描画もできません。別スレッドで処理するようにしてください。幸いなことに INotifyPropertyChanged による変更通知は自動的に Dispatcher で処理されるようになっているので、スレッド間呼び出しを気にする必要はありません。
- 回答としてマーク sauberwind 2010年12月12日 11:23
-
進捗状況を表示するダイアログのサンプルがあったので紹介しておきます。
http://www.hardcodet.net/2008/01/wpf-progress-dialog
ソースコードをダウンロードできるので、参考にするといいかもしれません。
なかむら(http://d.hatena.ne.jp/griefworker)- 回答としてマーク sauberwind 2010年12月12日 11:23
すべての返信
-
メインスレッドで処理しててはいけません。描画もメインスレッドで行っているので、重い処理でスレッドを占有している間は描画もできません。別スレッドで処理するようにしてください。幸いなことに INotifyPropertyChanged による変更通知は自動的に Dispatcher で処理されるようになっているので、スレッド間呼び出しを気にする必要はありません。
- 回答としてマーク sauberwind 2010年12月12日 11:23
-
進捗状況を表示するダイアログのサンプルがあったので紹介しておきます。
http://www.hardcodet.net/2008/01/wpf-progress-dialog
ソースコードをダウンロードできるので、参考にするといいかもしれません。
なかむら(http://d.hatena.ne.jp/griefworker)- 回答としてマーク sauberwind 2010年12月12日 11:23