为什么gif图像不能在无模式窗口中动画?

时间:2012-12-21 08:12:47

标签: c# wpf gif

要在WPF / C#中显示动画GIF,我在Microsoft MSDN中使用此代码示例:Show GIF animation in WPF

当我在无模式窗口(window.Show())中使用它时,图像不会生成动画。为什么呢?

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

在WPF项目中启动MainWindow我会显示一个窗口,以无模式完成我的第一个任务然后关闭它。(这些是在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类的AnimatedGIFControl_Loaded函数的下面添加了代码,以自动启动gif动画。

ImageAnimator.Animate(_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.Animate(_bitmap,OnFrameChanged);

此外,我添加到firstTask窗口和MainWindow以显示GIF动画。

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

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

我喜欢这个解决方案。

// 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()之前声明。