新手跪求大神帮忙啊 关于wpf image的显示问题

namaemuzu 2017-09-13 10:39:52
如题 我想让几张图片隔一定时间间隔顺序显示出来 可是一运行程序一只白屏过一会儿只有最后一张图片显示出来这是什么原理啊???
private void Grid_loaded(object sender,RoutedEventArgs e)
{
string [] paths = Directory.GetFiles(@"F:\MyPicture,""*.jpg");
for(inti = 0;i<paths.lenth-1;i++)
{
task.Dley(100).Wait();
Image1.Source = new BitMapImage(new Uri(paths[i]));
}
通过设置image元素的source每隔0.1秒显示一张指定路径的图片 我路径里有20张图片这个程序应该运行两秒以上的 结果却是程序运行白屏无响应过了两秒显示出了最后一张图片 求大哥大姐们救救小弟啊
...全文
225 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
exception92 2017-09-14
  • 打赏
  • 举报
回复
使用ThreadPool 也是可以的,如果感兴趣可以了解下它与Task的区别,ThreadPool执行的回调函数无法提供返回值,而Task的可以提供返回值,也就可以让我们能够知道任务什么时候完成,使得任务的执行可控,进而可以处理其它操作。
exception92 2017-09-14
  • 打赏
  • 举报
回复
task.Dley(100).Wait(); -》此处调用Wait的线程池线程会阻塞,导致UI不能更新,直到所有任务结束,也就for结束。 要想在执行for的时候同时也更新UI,应该将image的操作放到当前的UI线程中,WPF中的Dispatcher就是这个作用。 它将执行UI操作的代码从线程池线程调度到UI线程进行执行,就可以更新UI了,类似:

Task.Run(() =>
            {
                for (int i = 0; i < paths.Length; i++)
                {
                    Image1.Dispatcher.BeginInvoke(new Action(() =>
                    {
                        Image1.Source = new BitmapImage(new Uri(paths[i]));
                    }));
                    Task.Delay(100).Wait();
                }
            });
但 Source = new BitmapImage(new Uri(paths[i])); 这样的赋值会导致图片使用之后资源不能得到及时释放,应该设置BitmapImage的CacheOptionweiLoaded来缓存图片。具体msdn PS:个人观点,欢迎指正。
ilikeff8 2017-09-14
  • 打赏
  • 举报
回复
一只白屏过一会儿只有最后一张图片 -> 没有使用线程处理

            ThreadPool.QueueUserWorkItem(obj =>
            {
                string[] paths = Directory.GetFiles(@"F:\MyPicture,""*.jpg");
                for (int i = 0; i < paths.Length - 1; i++)
                {
                    Task.Delay(100).Wait();

                    App.Current.Dispatcher.Invoke(() =>
                    {
                        Image1.Source = new BitMapImage(new Uri(paths[i]));
                    });
                }
            });
        }
homesos 2017-09-14
  • 打赏
  • 举报
回复
引用 楼主 namaemuzu 的回复:
如题 我想让几张图片隔一定时间间隔顺序显示出来 可是一运行程序一只白屏过一会儿只有最后一张图片显示出来这是什么原理啊??? private void Grid_loaded(object sender,RoutedEventArgs e) { string [] paths = Directory.GetFiles(@"F:\MyPicture,""*.jpg"); for(inti = 0;i<paths.lenth-1;i++) { task.Dley(100).Wait(); Image1.Source = new BitMapImage(new Uri(paths[i])); } 通过设置image元素的source每隔0.1秒显示一张指定路径的图片 我路径里有20张图片这个程序应该运行两秒以上的 结果却是程序运行白屏无响应过了两秒显示出了最后一张图片 求大哥大姐们救救小弟啊
你这个是因为放在主线程里做导致的,主线程被阻塞了刷新不了界面。 放到计时器里完成吧,用DispatcherTimer。 http://blog.csdn.net/aiyongyyy/article/details/51670840
namaemuzu 2017-09-14
  • 打赏
  • 举报
回复
好吧貌似可以平分
namaemuzu 2017-09-14
  • 打赏
  • 举报
回复
哇 大家好热心啊 全部都解决了我的问题但是分貌似只能给一个人 就给我们的版主大大吧
yidaimu 2017-09-13
  • 打赏
  • 举报
回复
我用的手机网页访问的 不方便直接贴代码。我说个思路 不要在load中延时 这会导致界面加载时卡住 应该用thread或者task等执行延时 然后让UI线程执行界面更新 wpf中用grid.Dispatcher

110,529

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧