C# WinForm在新线程中动态创建控件时,gif图动不动

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

11 个解决方案

#1


难道没有人遇到这个情况吗?

#2


没有试过,无法确定。
倒是碰到过本来动变得不动的情况。

#3


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

#4


引用 3 楼 bunliney 的回复:
创建控件是执行在UI线程的,播放gif也是执行在UI线程,这样在创建控件时就卡住了gif。


那请问用什么方法解决啊

#5


参考一下这个 

 //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);

#6


学习。

#7


引用 5 楼 hjx398 的回复:
参考一下这个 

 //DataGridView 单元格里显示gif图片
                    int imgIndex = 0;
                    var t = new System.Threading.Timer(new System.Threading.TimerCallback((o) =>
                    {
……



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

#8


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

#9


你会不会看?网页中怎么可能在后台每100毫秒刷新页面的?

#10


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

#11


自己想办法解决了,谢谢大家的回答

#1


难道没有人遇到这个情况吗?

#2


没有试过,无法确定。
倒是碰到过本来动变得不动的情况。

#3


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

#4


引用 3 楼 bunliney 的回复:
创建控件是执行在UI线程的,播放gif也是执行在UI线程,这样在创建控件时就卡住了gif。


那请问用什么方法解决啊

#5


参考一下这个 

 //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);

#6


学习。

#7


引用 5 楼 hjx398 的回复:
参考一下这个 

 //DataGridView 单元格里显示gif图片
                    int imgIndex = 0;
                    var t = new System.Threading.Timer(new System.Threading.TimerCallback((o) =>
                    {
……



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

#8


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

#9


你会不会看?网页中怎么可能在后台每100毫秒刷新页面的?

#10


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

#11


自己想办法解决了,谢谢大家的回答