2012-01-03 50 views
2

我已經用C#編寫此代碼爲WP7:使UI線程等待使用的Thread.sleep

public void btn_handler(object sender, EventArgs args) 
    { 
     Button btn_Pressed = (Button)sender; 
     ImageBrush br = new ImageBrush(); 
     br.ImageSource = new BitmapImage(new Uri("/images/cat.png" 
               , UriKind.Relative)); 

     btn_Pressed.Background = br; 

     Thread.Sleep(5000); 

     SolidColorBrush sBrush = new SolidColorBrush(); 
     sBrush.Color = System.Windows.Media.Colors.White; 
     btn_Pressed.Background = sBrush;    
    } 

每當用戶點擊該按鈕,我希望按鈕的背景更改爲圖像。大約5秒後,我想讓背景變回白色。目前,該程序不會更改按鈕的背景圖像,它會等待5秒,並將背景直接更改爲白色。

我是WP的noob。我試圖尋找一個解決方案,我得到的是創建一個DispatcherThread,但我不知道如何繼續。請幫助:(

+0

永不睡眠()。在這種情況下,使用定時器 – 2012-01-03 09:43:26

回答

5

您目前的做法是不正確。這是保持UI纖維性忙着它更新UI時,它得到自由。

這裏是發生了什麼

Button獲取點擊。UI線程將按鈕背景改爲Images,然後休眠5秒,然後將背景更改爲白色,請注意,UI線程仍然很忙,它只會在實際UI自由時更新,一旦將UI改回到白色它得到自由和更新用戶界面,你看到屏幕上的變化。

你需要這樣做

//inside the button click event create a background worker 
BackgroundWorker worker = new BackgroundWorker(); 
worker.RunWorkerCompleted += new 

RunWorkerCompletedEventHandler(worker_RunWorkerCompleted); 
worker.DoWork += new DoWorkEventHandler(worker_DoWork); 
worker.RunWorkerAsync(); 

Button btn_Pressed = (Button)sender; 
ImageBrush br = new ImageBrush(); 
br.ImageSource = new BitmapImage(new Uri("/images/cat.png", UriKind.Relative)); 

btn_Pressed.Background = br; 


public static void worker_RunWorkerCompleted(object sender, 
               RunWorkerCompletedEventArgs e) 
    { 
    //once backgroudn work i.e. DoWork is complete this method will be 
    //called and code below will execute in UI thread 
    SolidColorBrush sBrush = new SolidColorBrush(); 
    sBrush.Color = System.Windows.Media.Colors.White; 
    btn_Pressed.Background = sBrush; 
    } 

public static void worker_DoWork(object sender, DoWorkEventArgs e) 
    { 
    //it will wait 5 secs in the background thread 
    Thread.Sleep(5000); 
    } 
+0

非常感謝。 :) – letsc 2012-01-03 09:51:43

+3

我不會阻止整個後臺線程只是爲了做到這一點。使用DispatcherTimer設置爲5秒會更清潔;) – 2012-01-03 20:14:47

+0

謝謝我不知道這個類之前 – 2012-01-04 04:56:39

3

你永遠不應該通過調用Thread.Sleep來阻止UI線程。

我認爲最好的解決方案是在您的XAML中創建一個storyboard,它將執行所需的視覺更改。您的按鈕點擊事件處理程序應該簡單地在故事板上調用Begin

+0

這實際上是最好的答案。通過在異步計時器上使線程休眠或使用後臺線程,您正在改變應用程序爲了視圖而工作的方式,像這樣的任何事情都應該使用故事板來完成。這是他們的目的。 – deanvmc 2012-02-21 11:29:47