2012-12-21 3 views
0

WPF/C#에서 애니메이션 GIF를 표시하려면 Microsoft MSDN에서이 코드 샘플을 사용하십시오. Show GIF animation in WPF.gif 이미지가 모덜리스 창에 애니메이션으로 적용되지 않는 이유는 무엇입니까?

모덜리스 창 (window.Show())에서 사용할 때 이미지가 움직이지 않습니다. 왜?

window.ShowDialog() (모달 창)은 올바르게 작동합니다. WPF 프로젝트에서

시작 MainWindow를 befor을 나는 모덜 내 첫 번째 작업을 수행하고 닫습니다 수있는 창을 보여줍니다.

// app.xaml.cs 
public partial class App : Application 
{ 
    private void Application_Startup(object sender, StartupEventArgs e) 
    { 
     FirstTask firstTask = new FirstTask(); 
     firstTask.Show(); 

     // do task 
     System.Threading.Thread.Sleep(5000); 

     firstTask.Close(); 

     MainWindow mainWindow = new MainWindow(); 

     mainWindow.ShowDialog(); 
    } 
} 

나는 코드 끝 아래에 추가 (이들은 App.xaml.cs를 시작 이벤트에) AnimatedGIFControl 클래스의 AnimatedGIFControl_Loaded 함수를 사용하여 자동으로 gif 애니메이션을 시작합니다.

ImageAnimator.Animate (_bitmap, OnFrameChanged);

전체 AnimatedGIFControl_Loaded 코드

 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 (_bitmap, OnFrameChanged);

또한 애니메이션 된 gif를 표시하기 위해 firstTask 창과 MainWindow에 추가합니다.

다른 문제 : firstTask.Close(); 응용 프로그램은 MainWindow를 표시하지 않습니다. 이유를 아셨습니까? 전화를 차단하고 실행을 계속하지 않습니다

+3

그 예제를 다운로드하고 (시작 창으로) 2 개의 버튼으로 추가 양식을 추가했습니다. 하나는 mainWindow를 Show 메소드로 시작하고 다른 하나는 ShowDialog로 시작합니다. 둘 다 올바르게 실행됩니다. 문제를 좀 더 자세히 설명해 주시겠습니까? – JleruOHeP

+0

Sleep() 호출을 잃어 버려야합니다. UI 스레드가 파열 된 동안에는 아무 것도 움직일 수 없습니다. 대신 타이머를 사용하십시오. –

답변

0

쇼() 메소드

모달 대화 상자가 폐쇄 (그리고 때까지

이 ShowDialog() 메소드는 블록 호출 및 실행과 대기도 그 동안의 모든 UI 메시지 파견됩니다)

0

나는 해결책을 좋아한다.

// 내가 백그라운드에서 내 작업을 수행 할 수있는 BackgroundWorker를 사용

/// <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.cs를. 작업 완료 후 firstTask를 닫고 mainWindow를 표시하십시오.

중요한주의 : 닫힌 첫 번째 작업 후에 mainWindow를 표시하기 위해 mainWindow는 firstTask.ShowDialog() 전에 선언해야합니다.

관련 문제