为什么gif图像不能在非模态窗口中动画

本文关键字:模态 窗口 动画 gif 图像 不能 为什么 | 更新日期: 2023-09-27 17:49:21

要在WPF/c#中显示GIF动画,我在Microsoft MSDN中使用以下代码示例:在WPF中显示GIF动画。

当我在非模态窗口(window.Show())中使用此功能时,图像不会动画。为什么?

使用window.ShowDialog()(模态窗口),它可以正常工作。

在启动主窗口前的WPF项目中,我显示了一个窗口,在非模态中执行我的第一个任务,然后关闭它。(这些都在app.xaml.cs启动事件)

// app.xaml.cs 
public partial class App : Application
{
    private void Application_Startup(object sender, StartupEventArgs e)
    {
        FirstTask firstTask = new FirstTask();
        firstTask.Show();
        // do task
        System.Threading.Thread.Sleep(5000);
        firstTask.Close();
        MainWindow mainWindow = new MainWindow();
        mainWindow.ShowDialog();
    }
}

我添加下面的代码结束AnimatedGIFControl_Loaded函数在AnimatedGIFControl类自动启动动画gif。

ImageAnimator。动画(_bitmap OnFrameChanged);

完整的AnimatedGIFControl_Loaded代码

     void AnimatedGIFControl_Loaded(object sender, RoutedEventArgs e)
    {
        // Get GIF image from Resources
        if (gifanimate.Properties.Resources.ProgressIndicator != null)
        {
            _bitmap = gifanimate.Properties.Resources.ProgressIndicator;
            Width = _bitmap.Width;
            Height = _bitmap.Height;
            _bitmapSource = GetBitmapSource();
            Source = _bitmapSource;
            ImageAnimator.Animate(_bitmap, OnFrameChanged);
        }             
    }

ImageAnimator。动画(_bitmap OnFrameChanged);

我还添加到firstTask窗口和MainWindow显示动画gif。

另一个问题:在firstTask.Close();应用程序不显示主窗口。你知道为什么吗?

为什么gif图像不能在非模态窗口中动画

Show()方法不阻塞调用并继续执行,

ShowDialog()方法阻塞调用并等待执行,直到模态对话框关闭(并且在此期间,所有UI消息都被调度)

我有一个解决办法。

//app.xaml.cs

/// <summary>
/// Interaction logic for App.xaml
/// </summary>
public partial class App : Application
{
    private FirstTask firstTask;
    private void Application_Startup(object sender, StartupEventArgs e)
    {
        BackgroundWorker backWorker = new BackgroundWorker();
        backWorker.DoWork += new DoWorkEventHandler(backWorker_DoWork);
        backWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backWorker_RunWorkerCompleted);
        backWorker.RunWorkerAsync();
        MainWindow mainWindow = new MainWindow();
        firstTask = new FirstTask();
        firstTask.ShowDialog();
        mainWindow.Show();
    }
    void backWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        firstTask.Close();
    }
    void backWorker_DoWork(object sender, DoWorkEventArgs e)
    {
        System.Threading.Thread.Sleep(5000);
    }
}

我使用BackgroundWorker在后台做我的任务。完成任务后关闭firstTask并显示mainWindow。

重要注意事项:要在关闭第一个任务后显示mainWindow, mainWindow应该在firstTask.ShowDialog()之前声明。