wpf新手,因为需求加载一个文件夹下的所有图片到ListView,所以我希望加载图片的这部分工作放在线程池里加载好了再送到UI上
ThreadPool.QueueUserWorkItem(new WaitCallback((obj) => { List<BitmapImage> lst = new List<BitmapImage>(); for (int i = 0; i < 10; i++) lst.Add(new BitmapImage(new Uri(@"E:\visual studio 2010\Projects\WpfApplication2\WpfApplication2\Images\Video.jpg", UriKind.RelativeOrAbsolute))); this.listbox.Dispatcher.BeginInvoke(new Action(() => this.listbox.ItemsSource = lst)); }));
可是这样会报错,好像是UI线程不能用线程池里创建的BitmapImage,BitmapImage不是UI类怎么会这样?那用什么类在非UI线程加载好图片直接送到UI层呢?????
你可以使用 Stream 在非 UI 线程中读取并保存,然后将其绑定到在 UI 创建的 BitmapImage 的 StreamSource 属性。
也就是说,先在 UI 绑定 List<BitmapImage> ,为每个 BitmapImage 设置一个“正在加载”的图片,然后启动一个线程去读取图片到 Stream,读取到后就 Invoke 赋值给 StreamSource 属性。
谢谢了,怎么就没想到先用缓存流加载,多谢提醒让我有用缓存流的意识。
在WPF里,一般是弄一个字符串列表,把图片的路径放到列表里,然后赋值给listbox的ItemsSource属性,然后在listbox的ItemTemplate里放入一个Image控件,绑定控件的Source属性即可
找到了另一个派生与BitmapSource的类BitmapFrame,这个玩意可以代替当Image的数据源,可以直接跨线程访问的,自己也特地试了下,在UI线程里实例化两个对象BitmapImage,BitmapFrame,然后在别的线程里访问这两个变量的Width属性,BitmapImage会报错,BitmapFrame不报。