首页 新闻 搜索 专区 学院

WPF BitmapImage跨线程问题!

0
[已解决问题] 解决于 2013-12-20 10:06

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层呢?????

kingcami的主页 kingcami | 菜鸟二级 | 园豆:204
提问于:2013-12-19 19:00
< >
分享
最佳答案
0

你可以使用 Stream 在非 UI 线程中读取并保存,然后将其绑定到在 UI 创建的 BitmapImage 的 StreamSource 属性。

也就是说,先在 UI 绑定 List<BitmapImage> ,为每个 BitmapImage 设置一个“正在加载”的图片,然后启动一个线程去读取图片到 Stream,读取到后就 Invoke 赋值给 StreamSource 属性。

奖励园豆:5
Launcher | 高人七级 |园豆:45045 | 2013-12-20 09:51

谢谢了,怎么就没想到先用缓存流加载,多谢提醒让我有用缓存流的意识。

kingcami | 园豆:204 (菜鸟二级) | 2013-12-20 10:05
其他回答(2)
0

在WPF里,一般是弄一个字符串列表,把图片的路径放到列表里,然后赋值给listbox的ItemsSource属性,然后在listbox的ItemTemplate里放入一个Image控件,绑定控件的Source属性即可

诶碧司 | 园豆:1912 (小虾三级) | 2013-12-19 21:38
0

 找到了另一个派生与BitmapSource的类BitmapFrame,这个玩意可以代替当Image的数据源,可以直接跨线程访问的,自己也特地试了下,在UI线程里实例化两个对象BitmapImage,BitmapFrame,然后在别的线程里访问这两个变量的Width属性,BitmapImage会报错,BitmapFrame不报。

kingcami | 园豆:204 (菜鸟二级) | 2013-12-19 23:14
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册