2017-08-24 47 views
-1

當我開始計劃,我需要加載一些項目和初始化它們。所以我在Thread中創建了一個進度條(下一個PB)。當加載開始時,每個連接都可以,但是在一瞬間,PB會停止並在init結束時跳轉到結束位置。進度條是跳躍

Progress bar

這裏線程,這增加了進度條每個程序塊。

public void initMapBlocks(int n, int m) 
    { 
     this.Dispatcher.Invoke(delegate() 
     { 
      Loader.Visibility = Visibility.Visible; 
      mainWindow.Visibility = Visibility.Hidden; 
     }); 
     for (int i = 0; i < n; i++) 
     { 
      for (int j = 0; j < m; j++) 
      { 
       this.Dispatcher.Invoke(delegate() 
       { 
        MapPart mp = new MapPart(); 
        mainCanvas.Children.Add(mp); 
        Loader.addPoint(1); 
       }); 
      } 
     } 
     this.Dispatcher.Invoke(delegate() 
     { 
      Loader.Visibility = Visibility.Hidden; 
      mainWindow.Visibility = Visibility.Visible; 
     }); 

    } 

是否有可能獲得完整的動畫?

--------更新--------
這裏代碼,我添加到進度欄的值。

public void addPoint(int x) 
    { 
     itemCountAlready += x; 
     loaderBar.Value += x; 
    } 

-----更新2 -------

private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 

     Thread thread = new Thread(new ThreadStart(() => initMapBlocks(100, 100))); 
     thread.Start(); 
    } 
+0

你在哪裏設置進度的價值?你的代碼段應該做什麼? – mm8

+0

@ mm8函數我在Update中包含的addPoint。 loaderBar它的進度條。 –

+0

您發佈的所有代碼都在UI線程上運行。你的長期工作在哪裏? – mm8

回答

2

initMapBlocks方法產生(MapPart)和消耗的同時(增加了裝載機的價值和mainCanvas子女)時間。您可以通過使用System.Collections.Generic.Queue

分離可以這樣定義

private Queue<MapPart> myQueue = new Queue<MapPart>(); 

相反,這些傢伙

mainCanvas.Children.Add(mp); 
Loader.addPoint(1); 

你可以寫簡單,就是對農產品

myQueue.Enqueue(mp); 

和您的隊列你可以在你的構造函數中定義一個DispatcherTimer消耗

DispatcherTimer myTimer = new DispatcherTimer { 
    Interval = TimeSpan.FromMilliseconds(1) 
}; 
myTimer.Tick += Consume; 
myTimer.Start(); 

Consume方法

private void Consume(object sender, EventArgs args) { 
    if (myQueue.Count > 0) { 
     //you don't need `this.Dispatcher.Invoke(delegate...` too 
     loaderBar.Value += myQueue.Dequeue(); 
     mainCanvas.Children.Add(mp); 
    } 
} 
+0

'DispatcherTimer myTimer =新DispatcherTimer { 間隔= TimeSpan.FromMilliseconds(1) }; myTimer.Tick + =消費; myTimer.Start(); 線程線程=新主題(新的ThreadStart(()=> initMapBlocks(100,100))); thread.Start();'消耗將在線程結束後工作; \ –

+0

好吧,我發現一個問題:) –