2016-04-08 6 views
0

Я использую How do I get an animated gif to work in WPF? в своей программе.Gif Animation XAML C# Paused

Первоначально в XAML, я поставил Visibility="Hidden" и

animateImage.Visibility = Visibility.Visible; использовать, когда я хочу выводимое изображение.

После осмотра изображения, я запускаю процесс. Однако, как только процесс начинается, анимация приостанавливается. Интересно, почему он это делает?

Я думал создать новый поток и запустить GIF в потоке и закрыть поток, когда процесс будет завершен.

EDIT

Код для процесса, который я бегу. Я хочу, чтобы анимация играла во время 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

Необходимо отправить больше кода. Вероятно, ваш процесс блокирует поток пользовательского интерфейса и не дает 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(); 

Вы блокируете потока пользовательского интерфейса, ожидая завершения процесса.

Если вы должны быть информированы, когда заканчивается процесс, сделать это в другом потоке, а затем вызвать функцию обратного вызова в потоке пользовательского интерфейса:

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), который требуется, когда вы управляете элементами управления пользовательского интерфейса.

Вы можете использовать несколько ContinueWith s, чтобы связать множество задач, чтобы они запускались один за другим. Просто передайте захваченный контекст синхронизации последнему, который устанавливает видимость анимации.

+0

Я бы хотел, чтобы он подождал. Как я могу сделать синхронный вызов для 'animateImage.Visibility = Visibility.Visible'? – Imsa

+0

Проверьте отредактированный ответ. –

+0

Я хочу, чтобы animateImage был видимым для каждого выполняемого процесса. Итак, процесс переходит в первые '{}' и 'Visibility.Visible', чтобы быть в 2-м' {} '. Спасибо – Imsa