私は、ディスクから400〜600画像(それぞれ200kbのaproxのサイズを持つ)を読み込み(表示する)必要があるWPFコントロールを構築しています。次はコントロールのコードビハインドです。リストボックスへの非同期画像のロード
private List<BitmapImage> pages = new List<BitmapImage>();
private BackgroundWorker worker;
public PagesListBox()
{
InitializeComponent();
worker = new BackgroundWorker();
worker.WorkerSupportsCancellation = false;
worker.WorkerReportsProgress = false;
worker.DoWork += worker_DoWork;
worker.RunWorkerCompleted += worker_RunWorkerCompleted;
}
void worker_DoWork(object sender, DoWorkEventArgs e)
{
List<BitmapImage> pagesList = new List<BitmapImage>();
var files = DirectoryServices.GetFiles(Properties.Settings.Default.PagesScanDirectory, new string[] { "*.tiff", "*.jpg", "*.png", "*.bmp" });
foreach (var file in files)
{
Uri uri = new Uri(file);
pagesList.Add(new BitmapImage(uri));
}
e.Result = pagesList;
}
void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
Pages.ItemsSource = (List<BitmapImage>)e.Result;
}
internal void LoadPages()
{
worker.RunWorkerAsync();
}
internal List<BitmapImage> AttachPages()
{
List<BitmapImage> attachedPages = new List<BitmapImage>();
foreach (BitmapImage eachItem in Pages.SelectedItems)
{
attachedPages.Add(eachItem);
pages.Remove(eachItem);
}
Pages.ItemsSource = null;
Pages.ItemsSource = pages;
return attachedPages;
}
私はバックグラウンドワーカーを使用することはできませんが、ビューにページリストを割り当てようとしましたが失敗します。
イメージを非同期的に(多分UIを更新して)読み込む方法はありませんか、私が試みているバックグラウンドワーカーのこのアプローチは問題ありません。そして、それは大丈夫です場合、どのように私は(完了イベント内)例外を解決することができます:
Must create DependencySource on same Thread as the DependencyObject.
おかげ
これは例外を修正することがあります。http://stackoverflow.com/questions/4705726/problem-with-binding-property-typeof-bitmapimage –
@SteveWong感謝を。実際にそれはしました。今、このアプローチがこの作業に適しているかどうかを今すぐにしてください。 –
私は自分自身が常にBackgroundWorkerを他の人に使うことを勧めていると感じています。私が見ているものから、あなたは完全にそれを使用しています。 – Rhyous