Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么gif图像不在无模式窗口中设置动画?_C#_Wpf_Gif - Fatal编程技术网

C# 为什么gif图像不在无模式窗口中设置动画?

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

要在WPF/C中显示动画GIF,我在Microsoft MSDN中使用以下代码示例:

当我在无模式窗口(
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);
    }
}