2016-04-08 75 views
0

我在我的程序中使用了How do I get an animated gif to work in WPF?Gif动画XAML C#已暂停

最初在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; 
} 
+0

您需要发表更多代码。您的流程很可能会阻止UI线程并阻止GIF播放,但您没有提供足够的详细信息来说明问题。 – WasGoodDone

+0

@WasGoodDone所有的代码都是问题中的链接。我所做的只是在程序中隐藏或显示属性。除上述内容外,还有其他哪些代码?谢谢 – Imsa

+0

你说“我运行一个进程。”这个过程的逻辑与你遇到的问题有关,因此将该代码作为问题的一部分会很有帮助。 http://stackoverflow.com/help/how-to-ask – WasGoodDone

回答

1

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

它去执行过程,而其他的东西在后台继续运行。

animateImage.Visibility = Visibility.Visible; 
    await Task.Run(() => 
    { 
     // Process goes here 
    }); 
animateImage.Visibility = Visibility.Hidden; 
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控件时所需的。

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

+0

我想让它等待。我如何为'animateImage.Visibility = Visibility.Visible'进行同步调用? – Imsa

+0

检查编辑的答案。 –

+0

我希望animateImage对于我运行的每个进程都可见。因此,流程进入第一个'{}'和'Visibility.Visible'处于第二个'{}'。谢谢 – Imsa