0

为了在 WPF/C# 中显示动画 GIF,我在 Microsoft MSDN 中使用了这个代码示例:在 WPF 中显示 GIF 动画

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

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

在 WPF Project Befor Start 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。你知道为什么吗?

4

2 回答 2

0

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

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

于 2012-12-22T13:41:54.347 回答
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。

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

于 2012-12-22T20:52:51.057 回答