2013-03-02 96 views
1

我正在爲wp 7.x/8製作一個應用程序。在c中睡眠/暫停功能#

有類似的功能 -

public void draw() 
{ 
    ............. 
    ImageBrush imgbrush = new ImageBrush(); 
    imgbrush.ImageSource = new BitmapImage(...); 

    rect.Fill = imgbrush; //rect is of type Rectangle that has been created 
          //and added to the canvas 
    ........ 
} 

和其他功能

private void clicked(object sender, RoutedEventArgs e) 
{ 
    draw(); 
    ........ 
    if (flag) 
    { 
      Thread.sleep(5000); 
      draw(); 
    } 
} 

但單擊該按鈕時,雙方戰平操作的結果同時出現在屏幕上。

如何使第二次繪製()操作的結果在一些延遲後出現?

或者有沒有像屏幕緩衝區的東西,直到緩衝區沒有填充屏幕不會刷新?

在這種情況下,如何顯式刷新或刷新屏幕或強制Rectangle的.fill()方法在屏幕上進行更改?

在這方面的任何幫助將不勝感激。

+0

您是否試圖增加延遲?也許讓它成爲一個愚蠢的高數字開始,然後調整它呢? – PsyKzz 2013-03-02 19:12:55

+1

我不知道爲什麼會出現這種情況,但凍結主UI線程通常不是一個好主意。你爲什麼不發射某種異步計時器? – OldProgrammer 2013-03-02 19:13:41

+0

您還沒有在OnPaint()方法中收集您的draawing代碼。這將提供對窗體的Invalidate(),Refresh()和Update()方法的訪問,以控制繪畫的各個方面。手動(和自動)雙緩衝很容易完成,但如果您需要,我還不確定。 – 2013-03-02 19:17:54

回答

0

問題是,您正在通過睡眠來阻止UI線程,所以直到該函數返回時,繪製消息纔會被同步發生。一個冒險的解決方案將會像下面這樣,儘管你應該改變你的應用程序設計以使用異步/等待模式。

private void clicked(object sender, RoutedEventArgs e) 
{ 
    draw(); 
    if (flag) 
    { 
     System.Threading.Tasks.Task.Run(() => 
     { 
      System.Threading.Thread.Sleep(5000); 
      Deployment.Current.Dispatcher.BeginInvoke(() => 
      { 
       draw(); 
      }); 
     }); 
    } 
} 
1

至於褲子說,因爲你的所有行動都是在同一個線程(第一次抽籤,睡眠,第二個平局)上,用戶界面本身從來沒有得到一個機會來更新。然而,實施稍微好一些(儘管它與上述建議的原理相同)。

通過使用定時器,可以讓踢它等待另一個線程,允許UI從第一次抽籤做第二次之前更新,就像這樣:

private void clicked(object sender, RoutedEventArgs e) 
{ 
    draw(); 
    ........ 
    if (flag) 
    { 
     var timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(5) }; 

     timer.Tick += (sender, args) => { timer.Stop(); draw(); }; 

     timer.Start(); 
    } 
} 

在此方案中,所有的調用由DispatcherTimer處理(它將自動回調到UI線程)。另外,如果繪圖需要連續調用兩次以上,定時器將繼續打勾直到停止,所以擴展到包括一個計數將會非常簡單。