2017-02-14 92 views
-4

如何延遲執行算法以直觀顯示算法中每次迭代的結果?當我嘗試更新下面代碼中對象的高度時,它只顯示最終結果。我怎樣才能顯示每一步發生的事情?如何可視化算法的步驟

namespace BubbleSortRappresentazione_grafica 
{  
    public partial class MainWindow : Window 
    { 
     int[] v; 

     public MainWindow() 
     { 
      InitializeComponent(); 

      Random rnd = new Random(); 

      v = new int[10]; 
      for (int j = 0; j < 10; j++) 
      { 
       v[j] = rnd.Next(0, 100); 
      } 
      _0.Height = v[0] + 20; 
      _1.Height = v[1] + 20; 
      _2.Height = v[2] + 20; 
      _3.Height = v[3] + 20; 
      _4.Height = v[4] + 20; 
      _5.Height = v[5] + 20; 
      _6.Height = v[6] + 20; 
      _7.Height = v[7] + 20; 
      _8.Height = v[8] + 20; 
      _9.Height = v[9] + 20; 
     }  

     private void Button_Click(object sender, RoutedEventArgs e) 
     { 
      // algoritmo ordinamento  

      for (int i = 0; i < 10; i++) 
      { 
       for (int j = 0; j < 10; j++) 
       {      
        if (v[j] > v[i]) 
        { 
         int tmp = v[j]; 
         v[j] = v[i]; 
         v[i] = tmp; 

         _0.Height = v[0] + 20; 
         _0.Content = v[0]; 
         _1.Height = v[1] + 20; 
         _1.Content = v[1] ; 
         _2.Height = v[2] + 20; 
         _2.Content = v[2]; 
         _3.Height = v[3] + 20; 
         _3.Content = v[3] ; 
         _4.Height = v[4] + 20; 
         _4.Content = v[4]; 
         _5.Height = v[5] + 20; 
         _5.Content = v[5]; 
         _6.Height = v[6] + 20; 
         _6.Content = v[6]; 
         _7.Height = v[7] + 20; 
         _7.Content = v[7]; 
         _8.Height = v[8] + 20; 
         _8.Content = v[8]; 
         _9.Height = v[9] + 20; 
         _9.Content = v[9]; 

         Thread.Sleep(100); 
        } 
       } 
      } 
     } 
    } 
} 
+0

因此,您想要「實時」查看組件更改內容和高度? –

+0

修改只在方法完成時纔會影響圖形界面,而不是在執行期間,因爲這些調用會阻止UI線程。使用「BackgroundWorker」實時查看更改。 – Kilazur

+0

當我做循環,例如我想改變按鈕的大小,它改變了大小,但圖形不是,它顯示了在循環結束而不是在它期間的變化,所以我想找到在週期內改變圖形的東西 –

回答

0

我相信,你真正需要的是Application.DoEvents方法:

for (int i = 0; i < 10; i++) 
{ 
    for (int j = 0; j < 10; j++) 
    {      
     if (v[j] > v[i]) 
     { 
      //... 
      Thread.Sleep(100); 
      Application.DoEvents(); 
     } 
    } 
} 

這將導致你在循環內進行,無論視覺上的變化將在每次迭代應用。您也可以考慮刪除.Sleep(),因爲我不確定它對您有多大用處。