C# 移动(重画)窗体后,动画gif on按钮停止

C# 移动(重画)窗体后,动画gif on按钮停止,c#,winforms,gif,animated-gif,C#,Winforms,Gif,Animated Gif,我在按钮上放置了一个动画gif。动画设置正常(大多数情况下:P),但当窗口被重新绘制(重新绘制)时,动画停止。在处理绘制事件时,我尝试刷新按钮(button.refresh()),但没有解决问题\ 有人知道如何解决这个问题吗?也许我弄错了,但我认为问题在于,当动画对象被另一个窗口遮挡时,而不是当窗体重新绘制时,动画停止。这是有意的行为;错误在于,在Windows Vista和Windows 7中,显示是合成的,因此即使窗口被“遮挡”,它也不会真正被遮挡,并且在取消遮挡时,它也不会接收绘画消息,这

我在按钮上放置了一个动画gif。动画设置正常(大多数情况下:P),但当窗口被重新绘制(重新绘制)时,动画停止。在处理绘制事件时,我尝试刷新按钮(button.refresh()),但没有解决问题\


有人知道如何解决这个问题吗?

也许我弄错了,但我认为问题在于,当动画对象被另一个窗口遮挡时,而不是当窗体重新绘制时,动画停止。这是有意的行为;错误在于,在Windows Vista和Windows 7中,显示是合成的,因此即使窗口被“遮挡”,它也不会真正被遮挡,并且在取消遮挡时,它也不会接收绘画消息,这将使动画返回

此错误似乎会影响任何带有动画对象的ButtonBase派生控件

问题在于Control.isWindowObsublized函数。它会变成现实。您可以在ButtonBase.cs文件的System.Windows.Forms.ButtonBase.OnFrameChanged中看到,在最后有一行代码显示:

if (IsWindowObscured) {
 StopAnimate();
 return;
}
这就是问题所在

仅供参考,OnFrameChanged是从ImageAnimator线程调用的。这是在ImageAnimator.Animate(图像,eventhandler)中指定的回调。ButtonBase在private void Animate(bool Animate)函数中设置此选项。ImageAnimator线程每50毫秒轮询一次,检查是否需要为其监视的任何图像添加新帧;如果是,它将设置一个标志,使控件无效并绘制新帧

由于我们无法做到这一点,我认为我们对此无能为力。作为一种解决方法,我在表单中实现了一个计时器,该计时器每500毫秒使控件失效一次,因此如果控件以前停止了,它将强制它重新启动。这是相当恼人的,我们无法覆盖,甚至无法访问它。恐怕唯一的解决办法就是上面的破解,或者创建或使用自己或第三方创建的控件

澄清一下——这只是使用桌面合成的WindowsVista或Windows7上的一个问题。问题是,windows从来不会像不使用桌面合成时那样被真正遮挡。它们始终由窗口管理器缓冲。(windows 2000+中有一些特殊的分层窗口,但现在请忽略)。以前,如果窗口的某些部分不在屏幕上或被其他窗口遮挡,则这些部分不可用。当它们重新进入视野时,通过改变焦点或位置等方式,系统将通知该区域重新喷漆。但是,在使用桌面合成时,不需要重新绘制,因为窗口的实际内容会缓冲在其他位置。这就是为什么窗口预览可以在任务栏中工作,例如Flip-3d。副作用是,如果代码在被遮挡后再次可见时希望获得绘制消息,则该代码将失败。ButtonBase代码希望在返回视图后收到一条绘制消息,该消息将再次启动动画。因此,这种优化变成了一个bug


该问题应在Microsoft Connect中报告,但不太可能得到解决。

我已对此进行了测试,重新绘制窗口时动画不会停止。处理onPaint事件时,您是否执行其他操作?你试过没有覆盖onPaint吗?BackgroundWorker正在工作(但那是另一个线程)。当我移动窗口时,动画停止工作。另外,有时动画不会启动:/(请注意,这个带有动画的按钮在单击另一个按钮之前是不可见的,因此在激活之前,它被禁用且不可见)。经过一些考虑-可能是windows 7兼容性问题,我需要稍后在xp机器上测试它。不过这并不是什么重要的问题。我也有类似的事情发生。MDI窗体上的动画GIF有时会停止动画。将MDI窗体拖到其容器的一侧(使GIF不可见),然后将其拖回视图中,可以使动画再次开始播放。我正在使用WindowsVista.Thx进行深入解释。我的问题不知怎么被…解决了。。。隐马尔可夫模型。。真的不知道到底是什么-更新我的VS,更改gif。我基本上放弃了,在对代码和gif进行了无数次更改之后,它终于开始按照我的要求工作了:P