2017-02-14 50 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(),因为我不确定它对您有多大用处。