C# 在窗体中暂停GIF

C# 在窗体中暂停GIF,c#,picturebox,gif,C#,Picturebox,Gif,只是想知道如何暂停GIF图像? 我正在访问一台服务器,我希望在发生某些事情时播放gif图像,如果系统冻结,我希望它暂停。 我有一个附有图片的盒子。 这可能吗?PictureBox使用ImageAnimator类为GIF图像设置动画。它具有停止动画的Stop()方法。不幸的是,它没有公开您需要修补的成员,您必须自己使用ImageAnimator 如果您不反对使用反射来绕过这些限制,那么您可以使用后门。这通常是一个相当糟糕的主意,但Winforms处于维护模式,PictureBox再次更改的可能性非

只是想知道如何暂停GIF图像? 我正在访问一台服务器,我希望在发生某些事情时播放gif图像,如果系统冻结,我希望它暂停。 我有一个附有图片的盒子。
这可能吗?

PictureBox使用ImageAnimator类为GIF图像设置动画。它具有停止动画的Stop()方法。不幸的是,它没有公开您需要修补的成员,您必须自己使用ImageAnimator

如果您不反对使用反射来绕过这些限制,那么您可以使用后门。这通常是一个相当糟糕的主意,但Winforms处于维护模式,PictureBox再次更改的可能性非常接近于零。看起来是这样的:

using System.Reflection;
...

    private static bool IsAnimating(PictureBox box) {
        var fi = box.GetType().GetField("currentlyAnimating",
            BindingFlags.NonPublic | BindingFlags.Instance);
        return (bool)fi.GetValue(box);
    }
    private static void Animate(PictureBox box, bool enable) {
        var anim = box.GetType().GetMethod("Animate", 
            BindingFlags.NonPublic | BindingFlags.Instance, null, new Type[] { typeof(bool) }, null);
        anim.Invoke(box, new object[] { enable });
    }
此示例按钮的单击事件可靠地停止并启动动画:

    private void button1_Click(object sender, EventArgs e) {
        Animate(pictureBox1, !IsAnimating(pictureBox1));
    }

如果你不喜欢这些黑客,那就自己使用ImageAnimator。

PictureBox使用ImageAnimator类来制作GIF图像的动画。它具有停止动画的Stop()方法。不幸的是,它没有公开您需要修补的成员,您必须自己使用ImageAnimator

如果您不反对使用反射来绕过这些限制,那么您可以使用后门。这通常是一个相当糟糕的主意,但Winforms处于维护模式,PictureBox再次更改的可能性非常接近于零。看起来是这样的:

using System.Reflection;
...

    private static bool IsAnimating(PictureBox box) {
        var fi = box.GetType().GetField("currentlyAnimating",
            BindingFlags.NonPublic | BindingFlags.Instance);
        return (bool)fi.GetValue(box);
    }
    private static void Animate(PictureBox box, bool enable) {
        var anim = box.GetType().GetMethod("Animate", 
            BindingFlags.NonPublic | BindingFlags.Instance, null, new Type[] { typeof(bool) }, null);
        anim.Invoke(box, new object[] { enable });
    }
此示例按钮的单击事件可靠地停止并启动动画:

    private void button1_Click(object sender, EventArgs e) {
        Animate(pictureBox1, !IsAnimating(pictureBox1));
    }

如果你不喜欢这些类型的黑客,那么就自己使用ImageAnimator。

将所需的帧转换为位图

        Image gifImg = ActivscreenLibraries.Resources.throbber_running;
        FrameDimension dimension = new FrameDimension(gifImg.FrameDimensionsList[0]);
        // Number of frames
        int frameCount = gifImg.GetFrameCount(dimension);
        // Return an Image at a certain index
        gifImg.SelectActiveFrame(dimension, 5);
        Bitmap aa = new Bitmap(gifImg);
        pictureBox1.Image = Image.FromHbitmap(aa.GetHbitmap());

将所需帧转换为位图

        Image gifImg = ActivscreenLibraries.Resources.throbber_running;
        FrameDimension dimension = new FrameDimension(gifImg.FrameDimensionsList[0]);
        // Number of frames
        int frameCount = gifImg.GetFrameCount(dimension);
        // Return an Image at a certain index
        gifImg.SelectActiveFrame(dimension, 5);
        Bitmap aa = new Bitmap(gifImg);
        pictureBox1.Image = Image.FromHbitmap(aa.GetHbitmap());

正如你在评论中所读到的,米查已经链接到你可以简单设置

myPictureBox.Enabled = false;
停止图像动画。将其设置为
true
以再次启动。最重要的是不需要反思


Windows.Forms.PictureBox.OnEnabledChanged
主要调用
动画(已启用)
。请参阅。

,因为您可以在评论中看到Micha链接到您可以简单设置的内容

myPictureBox.Enabled = false;
停止图像动画。将其设置为
true
以再次启动。最重要的是不需要反思


Windows.Forms.PictureBox.OnEnabledChanged
主要调用
动画(已启用)
。请参阅。

请将其标记为winforms、WPF或ASP.NET。这可能会有所帮助:因为您知道(从外观上看)状态何时发生变化(从空闲进行中到空闲进行中,反之亦然),对于平台的配置,一个可能的解决方案是使用一个动画gif和一个普通gif,并在适当时对其进行更改。请将其标记为winforms、WPF,或者ASP.NET这可能会有所帮助:由于您知道(从外观上看)状态何时发生变化(从空闲进行中到空闲进行中,反之亦然),因此对于平台而言,一个可能的解决方案是使用一个动画gif和一个普通gif,并在适当时对其进行更改。这将停止动画,但是,当您重新启用长方体时,动画每次都会从开头开始,看起来非常不和谐。这将停止动画,但当您重新启用长方体时,动画每次都会从开头开始,看起来非常不和谐。这将从第一帧重新开始播放动画。是否有任何方法可以真正暂停动画并从暂停的帧恢复播放?这将重新从第一帧开始播放动画。有没有办法真正暂停动画并从暂停的帧恢复播放?