通过在鼠标事件中启用和禁用 PictureBox 中的 gif 动画来停止和启动它

Stop and start gif animation in PictureBox by enabling and disabling it in mouse events

我向 PictureBox 添加了一个 gif,当加载表单时,我禁用了 PictureBox 以停止播放 gif。然后,当我将光标悬停在 PictureBox 上时,我想让 PictureBox 开始播放 gif,但它不播放 gif。

为什么鼠标悬停时无法启用 PictureBox 和播放 gif,我该如何解决这个问题?

代码:

private void MainPage_Load(object sender, EventArgs e)
{
    pictureBox1.Enabled = false;
}

private void pictureBox1_MouseHover(object sender, EventArgs e)
{
    pictureBox1.Enabled = true;  
}

private void pictureBox1_MouseLeave(object sender, EventArgs e)
{
    pictureBox1.Enabled = false;
}

接收禁用控件的鼠标事件

禁用控件时,鼠标事件将不会被控件接收,而会被其父级接收。

所以在这种情况下,您可以处理父级的 MouseHover 事件并查看鼠标位置是否在 PictureBox 的范围内,然后启用它。

例如。假设图片框的父级是以下形式:

private void form1_MouseHover(object sender, EventArgs e)
{
    if (pictureBox1.Bounds.Contains(this.PointToClient(Cursor.Position)))
    {
        pictureBox1.Enabled = true;
    }
}

在 PictureBox 中停止或启动 gif 动画

除了禁用和启用PictureBox启动或停止gif动画外,另一种通过调用private void Animate(bool animate)方法启用或禁用动画的选项:

void Animate(PictureBox pictureBox, bool animate)
{
    var animateMethod = typeof(PictureBox).GetMethod("Animate",
    System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance,
    null, new Type[] { typeof(bool) }, null);
    animateMethod.Invoke(pictureBox, new object[] { animate });
}

然后不禁用控件:

Animate(pictureBox1, true); //Start animation
Animate(pictureBox1, false); //Stop animation