【问题标题】:Gif Animation XAML C# PausedGif 动画 XAML C# 暂停
【发布时间】:2016-04-08 18:02:58
【问题描述】:

我在我的程序中使用How do I get an animated gif to work in WPF?

最初在 XAML 中,我设置了 Visibility="Hidden"

当我想要显示图像时使用animateImage.Visibility = Visibility.Visible;

显示图像后,我运行一个进程。但是,一旦该过程开始,动画就会暂停。 我想知道它为什么要这样做?

我正在考虑创建一个新线程并在线程中运行 GIF,并在处理完成后关闭线程。

编辑

我正在运行的进程的代码。我希望在 GPUpdate 期间播放动画。

ExecProc("gpupdate", "/force");

private static bool ExecProc(string file, string arg)
{
    bool flag = true;
    try
    {
        //Create a new process info structure.
        ProcessStartInfo pInfo = new ProcessStartInfo();
        pInfo.FileName = file;
        pInfo.CreateNoWindow = true;
        pInfo.Arguments = arg;
        pInfo.WindowStyle = ProcessWindowStyle.Hidden;

        Process ps = new Process();
        ps.StartInfo = pInfo;
        ps.Start();

        //Wait for the process to end.
        ps.WaitForExit();
    }
    catch (Exception e)
    {
        writeLog("Error: " + e + " running " + file + " " + arg);
        flag = false;
    }
    return flag;
}

【问题讨论】:

  • 您需要发布更多代码。很可能您的进程阻塞了 UI 线程并阻止 GIF 播放,但您没有提供足够的细节来确定。
  • @WasGoodDone 所有代码都是问题中的链接。我所做的只是让它在我的程序中隐藏或可见的属性。除了上述代码之外,您还指的是哪些其他代码?谢谢
  • 你说“我运行一个进程”。您对此过程的逻辑与您遇到的问题相关,因此将该代码作为您问题的一部分会很有帮助。 stackoverflow.com/help/how-to-ask
  • @WasGoodDone 我更新了问题。

标签: wpf multithreading xaml gif animated-gif


【解决方案1】:

问题来了:

//Wait for the process to end.
ps.WaitForExit();

您正在阻塞 UI 线程,等待进程完成。

如果您需要在进程完成时收到通知,请在另一个线程中执行此操作,然后在 UI 线程上调用回调:

var uiScheduler = TaskScheduler.FromCurrentSynchronizationContext();
animateImage.Visibility = Visibility.Visible;
Task.Run(() =>
    {
        // Start the process and wait for it to finish, as you did before.
    }).ContinueWith(task =>
    {
        animateImage.Visibility = Visibility.Hidden;
        // Do whatever you need to do when the process is finished.
    }, uiScheduler);

Task.Run 触发一个线程并在该线程中执行任务(它实际上使用线程池,并且不创建新线程)。 ContinueWith 做同样的事情,但在前一个任务完成后启动任务。

TaskScheduler.FromCurrentSynchronizationContext() 从主线程捕获同步上下文。将该同步上下文传递给ContinueWith,会导致它在主 (UI) 线程中触发任务,这在您操作 UI 控件时是必需的。

您可以使用多个ContinueWiths 链接许多任务,以便它们一个接一个地运行。只需将捕获的同步上下文传递给最后一个,这将设置动画可见性。

【讨论】:

  • 我希望 animateImage 对于我运行的每个进程都是可见的。因此,进程进入第一个{ }Visibility.Visible 进入第二个`{}'。谢谢
  • 或者如果你能用我上面的代码更新代码,那就太好了。
  • @Imsa 是的。试试看,告诉我结果。
  • 我收到以下错误:The calling thread cannot access this object because a different thread owns it.
  • @Imsa 确保您按照上面的代码示例执行了所有操作。如果它不起作用,请在此处发布您的代码,以便我查看。
【解决方案2】:

Mohammad Dehghan 真的很有帮助,让我朝着正确的方向前进。但是,我看起来有些不同,所以发布了最终结果。

当其他东西在后台继续运行时,它会继续执行进程。

animateImage.Visibility = Visibility.Visible;
    await Task.Run(() =>
    {
        // Process goes here
    });
animateImage.Visibility = Visibility.Hidden;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-02
    • 2011-11-20
    • 2016-03-28
    • 2013-11-25
    • 2012-08-21
    • 2015-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多