为什么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();应用程序不显示主窗口。你知道为什么吗?
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()之前声明。