Silverlight OpenFileDialog DoEvents同等
-
20-09-2019 - |
質問
ユーザーが選択した後、大きなファイルを処理しています。私のコードは次のようになります:
if (FileDialog.ShowDialog() == true) {
// process really big file
}
これによりUIがフリーズするため、ユーザーがファイルを選択して、何かが起こっているという視覚的な手がかりを与える前に、まず読み込みメッセージを表示しようとしました。
loadingMessage.Visibility = Visibility.Visible;
if (FileDialog.ShowDialog() == true) {
// process really big file
}
残念ながら、これはファイルが処理されている間、まだUIを完全にフリーズします。
私が見つけたのは、ファイルの選択の直後にメッセージボックスを発射する場合です。フードの下で「doevents」タイプの呼び出しを行うと、ランタイムでフラッシュイベント/UIアイテムを取得すると思います。
loadingMessage.Visibility = Visibility.Visible;
if (FileDialog.ShowDialog() == true) {
MessageBox.Show("Sync!");
// process really big file
}
このような場合、大きなファイルはまだゆっくりと処理されますが、読み込みメッセージが表示され、画面UIが同期されます(待機カーソルを表示するなど、本物で他のことをしています)。
質問:
SilverlightにはDoEvents機能がありません。 MessageBox.show以外に、UIを同期し、OpenFileDialogがUIを凍結するのを防ぐという同じ効果を持つことができる電話はありますか?
解決
背景ワーカーを使用して、バックグラウンドで重い計算を実行します。操作が完了していることをUIに通知する場合、前述のクラスのRunWorkErcompletedイベントを使用できます。これに代わるものは、完全に個別のスレッドを使用してから、Dispatcher.beginInvoke()を使用してUIスレッドにコールバックを使用することです。別のスレッドに.NETを使用すると、この種の同期がなければGUIコンポーネントにアクセスできないことを忘れないでください。
他のヒント
バックグラウンドワーカークラスを使用して、バックグラウンドスレッドで本当に大きなファイルを処理しますか?ここにあなたのためのリンク: 方法:バックグラウンドワーカーを使用します