要在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。你知道为什么吗?
答案 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()之前声明。