如何同步图片框图像

时间:2014-01-01 13:53:01

标签: c# .net winforms user-interface reflection

在我用C#编写的winforms应用程序中,我需要同步放在2个图片盒上的2个GIF图像的时间。这意味着,一个图片框有一个动画GIF图像,第二个图片框有相同的动画GIF图像,但颜色不同。当出现第二个图片框时,两个图像必须以相同的帧序列显示。

根据King King在this thread中的回答,我实现了这种扩展方法:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void _buttonTest_Click(object sender, EventArgs e)
    {
        _pictureBox2.Visible = !_pictureBox2.Visible;

        if (_pictureBox2.Visible)
            _pictureBox2.SynchronizeWith(_pictureBox1);
    }
}

public static class PictureBoxServices
{
    public static void SetPictureFrameIndex(this PictureBox pictureBox, int index)
    {
        pictureBox.Image.SelectActiveFrame(new FrameDimension(pictureBox.Image.FrameDimensionsList[0]), index);
        pictureBox.Image = pictureBox.Image;    // restart on selected index
    }

    public static int GetPictureFrameIndex(this PictureBox pictureBox)
    {
        throw new NotImplementedException();
    }

    public static void SynchronizeWith(this PictureBox pictureBoxThis, PictureBox pictureBoxToSynchronizeWith)
    {
        pictureBoxThis.SetPictureFrameIndex(pictureBoxToSynchronizeWith.GetPictureFrameIndex());
    }
}

我有两个问题:

  1. 我不知道如何实现GetPictureFrameIndex
  2. SetPictureFrameIndex不起作用。它设置并显示所选框架,但下一个显示的框架始终为frameindex = 1,而不是frameindex = index + 1
  3. 是的,有人能帮帮我吗? 即使是使用反射的黑客解决方案也可以(如果需要使用反射)。

2 个答案:

答案 0 :(得分:0)

有一个类似问题的黑客攻击可以帮到你:Pause a GIF in a form

此外,您可以尝试同时重置图像。将图像放在临时变量中,将两个图片框的图像分配为空,然后同时重新分配图像。

答案 1 :(得分:0)

一种解决方法可能是将当前图像卸载到临时变量中,为该图像设置一个临时值,然后将其设置回temp变量。这会强制每个图像从其起点刷新。

只需枚举每个图片框,它就会刷新为几乎同步,这取决于您拥有的数量和我估计的操作时间。

假设您有一个名为pic的图片框。

var loc = pic.ImageLocation;
pic.ImageLocation = "";
pic.ImageLocation = loc;