2012-08-09 5 views
0

일부 구성 요소 검사를 수행하는 동안 내 앱에 진행률 막대가 표시되기를 원합니다. 그러나 데스크톱 응용 프로그램 프로그래밍 및 WPF에 대한 지식 부족으로 인해 적절한 장소를 찾을 수 없습니다.WPF 진행률 막대를 시작하는시기

Window_Loaded(), ContentRendered() 동안 진행률 표시 줄을 늘리려고했지만 행운이 없었습니다.

progressBar가 증가하는 것을 보여주는 대신 진행률 막대의 최종 상태 만 표시합니다. 여기

내가 CheckComponents() 방법을 놓아야 코드

public partial class Loading : Window 
{ 
    public Loading() 
    { 
     InitializeComponent(); 
     SetProgressBar(); 
     this.Show(); 
     CheckComponents(); 
    } 

    private void CheckComponents() 
    { 
     System.Threading.Thread.Sleep(3000); 

     CheckProductionDBConnection(); 
     pgrsBar.Value = 30; 

     System.Threading.Thread.Sleep(3000); 
     CheckInternalDBConnection(); 
     pgrsBar.Value = 60; 

     System.Threading.Thread.Sleep(3000); 
     CheckProductionPlanning(); 
     pgrsBar.Value = 90; 

     //MainWindow mainWindow = new MainWindow(); 
     //mainWindow.Show(); 
    } 

    private void SetProgressBar() 
    { 
     pgrsBar.Minimum = 0; 
     pgrsBar.Maximum = 100; 
     pgrsBar.Value = 0; 
    } 
//more code down here... 

입니까?

답변

1

이 코드는 Activated 이벤트에 등록 된 이벤트 처리기에 넣을 수 있습니다. 한 가지 잡히는 점은 창이 창을 잃어버린 후 포커스를받을 때마다 Activated 이벤트가 시작된다는 것입니다. 이 문제를 해결하기 위해 이벤트 처리기에서 수행 할 수있는 첫 번째 작업은 Activated 이벤트의 구독을 취소하여 코드가 윈도우가 처음 활성화 될 때만 실행되도록하는 것입니다.

지연을 사용하여 기본 스레드를 차단하지 않으려면이 작업을 작업자 스레드로 오프로드해야합니다. 그렇게하면 Progess Bar의 값을 업데이트하기 위해 호출을 호출해야합니다.

public Loader() 
{ 
    InitializeComponent(); 
    SetProgressBar(); 

    this.Activated += OnActivatedFirstTime; 
} 

private void OnActivatedFirstTime(object sender, EventArgs e) 
{ 
    this.Activated -= this.OnActivatedFirstTime; 

    ThreadPool.QueueUserWorkItem(x => 
    { 
    System.Threading.Thread.Sleep(3000); 

    CheckProductionDBConnection(); 
    this.Dispatcher.BeginInvoke(new Action(() => pgrsBar.Value = 30)); 

    System.Threading.Thread.Sleep(3000); 
    CheckInternalDBConnection(); 
    this.Dispatcher.BeginInvoke(new Action(() => pgrsBar.Value = 60)); 

    System.Threading.Thread.Sleep(3000); 
    CheckProductionPlanning(); 
    this.Dispatcher.BeginInvoke(new Action(() => pgrsBar.Value = 90)); 
    }); 
} 

private void SetProgressBar() 
{ 
    pgrsBar.Minimum = 0; 
    pgrsBar.Maximum = 100; 
    pgrsBar.Value = 0; 
} 
+0

내가 상상하는 것처럼 간단하지 소리 :

다음은 시작하는 몇 가지 예제 코드입니다. 고마워요. WPF가 일반적인 Windows 양식과 완전히 다르다는 것을 알았습니다. –

+0

그냥 호기심이 다시 ..이게 뭐야? 'this.Dispatcher.BeginInvoke (새로운 액션 (() => pgrsBar.Value = 90)); '람다 뭐야? –

+0

이 작품! 스레딩 소유 오류를 피하기 위해'CheckProductionDBConnection();을이 this.Dispatcher.BeginInvoke (새 작업() => CheckProductionDBConnection());로 변경해야합니다. 다른 Check .. 함수와 동일합니다. 다시 한 번 감사드립니다! –

관련 문제