C# 为什么gif图像不在无模式窗口中设置动画?
要在WPF/C中显示动画GIF,我在Microsoft MSDN中使用以下代码示例: 当我在无模式窗口(C# 为什么gif图像不在无模式窗口中设置动画?,c#,wpf,gif,C#,Wpf,Gif,要在WPF/C中显示动画GIF,我在Microsoft MSDN中使用以下代码示例: 当我在无模式窗口(window.Show())中使用此选项时,图像不会产生动画。为什么? 使用window.ShowDialog()(模式窗口)它可以正常工作 在WPF Project Befor Start Main window中,我在无模式模式下显示了一个执行第一个任务的窗口,然后将其关闭。(这些在app.xaml.cs Startup event中) 我在AnimatedGIFControl类中添加An
window.Show()
)中使用此选项时,图像不会产生动画。为什么?
使用window.ShowDialog()
(模式窗口)它可以正常工作
在WPF Project Befor Start Main window中,我在无模式模式下显示了一个执行第一个任务的窗口,然后将其关闭。(这些在app.xaml.cs Startup event中)
我在AnimatedGIFControl类中添加AnimatedGIFControl_加载函数的下面代码结尾,以自动启动gif动画
ImageAnimator.Animate(_位图,OnFrameChanged)
完整的AnimatedGIFControl\u加载的代码
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(_位图,OnFrameChanged)
我还添加到firstTask窗口和Main窗口以显示动画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);
}
}
//
///App.xaml的交互逻辑
///
公共部分类应用程序:应用程序
{
私有第一任务第一任务;
私有void应用程序\u启动(对象发送方、StartupEventArgs e)
{
BackgroundWorker backWorker=新的BackgroundWorker();
backWorker.DoWork+=新的DoWorkEventHandler(backWorker\u DoWork);
backWorker.RunWorkerCompleted+=新的RunWorkerCompletedEventHandler(backWorker\u RunWorkerCompleted);
backWorker.RunWorkerAsync();
MainWindow MainWindow=新的MainWindow();
firstTask=新的firstTask();
firstTask.ShowDialog();
mainWindow.Show();
}
void backWorker\u RunWorkerCompleted(对象发送方,RunWorkerCompletedEventArgs e)
{
firstTask.Close();
}
void backWorker_DoWork(对象发送方,DoWorkEventArgs e)
{
系统线程线程睡眠(5000);
}
}
我使用BackgroundWorker在后台执行任务。完成任务后,关闭firstTask并显示Main窗口
重要注意事项:对于在关闭第一个任务后显示mainWindow,mainWindow应该在firstTask.ShowDialog()之前声明。我下载了该示例并为其添加了额外的表单(作为启动窗口),带有两个按钮-一个按钮将使用Show方法启动mainWindow,另一个按钮使用ShowDialog。它们都运行正常。您能更详细地描述一下您的问题吗?您将不得不丢失Sleep()调用,当您的UI线程处于紧张状态时,任何东西都无法动画化。改用定时器。
/// <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);
}
}