本人最近在编写一个考试程序,主窗口中有二个Panel控件,一个Panel控件放置一个PictureBox控件,图片为一个gif正在加载的图片,设置为隐藏状态。另一个Panel控件用来动态创建单选框和复选框的题目内容。
在窗口的Load事件中将图片的Panel的Visible置为True状态,并启动一个新线程,用来连接数据库后动态创建单选框和复选框,创建结束后再隐藏图片,但是程序运行时,图片是显示出来了,但在创建动态控件时,gif图片一直不动,直到单选框和复选框创建结束后,图片就隐藏了,我自己认为虽然是在新线程中创建控件,但是还是在主线程中,所以导致gif不动,不知是不是这个原因,有哪位遇到过同样的问题啊,能不能提供一下解决方法,在此万分感谢!

解决方案 »

  1.   

    创建控件是执行在UI线程的,播放gif也是执行在UI线程,这样在创建控件时就卡住了gif。
      

  2.   

    参考一下这个  //DataGridView 单元格里显示gif图片
                        int imgIndex = 0;
                        var t = new System.Threading.Timer(new System.Threading.TimerCallback((o) =>
                        {
                            FrameDimension fd = new FrameDimension(imgs[2].FrameDimensionsList[0]);
                            int count = imgs[2].GetFrameCount(fd);
                            imgIndex++;
                            if (imgIndex == count)
                            {
                                imgIndex = 0;
                            }
                            imgs[2].SelectActiveFrame(fd, imgIndex);
                            this.Invoke(new Action(() =>
                            {
                                dataGridView1[2, i].Value = imgs[2];
                                dataGridView1.InvalidateCell(2, i);
                            }));                    }), null, 0, 100);
      

  3.   

    这应该是在网页中吗,我说的是在WinForm中
      

  4.   

    主线程播放GIF.其他播放的话GIF是不动的
      

  5.   

    后台线程需要跳转到UI线程才能操作界面对象的,可以用过Invoke方法调用,或者用timer实现