2012-03-13 3 views
0

Thread.sleep()を実行する前にwpf要素をリフレッシュする方法を知りたい。以下のシナリオでは、Thread.sleep()コールが最初に実行され、次にwpf要素が更新されます。私はいくつかの変数assignationsとコメントを追加しました、私が欲しいものを理解するには:Thread.sleepを実行する前にwpf要素を更新する

EDIT:button_clickイベントハンドラで

は、私はこれを試してみました。

private void button_click(object sender, RoutedEventArgs e){ 
    //fist of all, set the static variable to_change to true, then Update GUI label 
    to_change = true; 
    Thread thread = new Thread(UpdateGUI); 
    thread.Start(); 
    //Then sleep 1 second and (With label changed) 
    Thread.Sleep(1000);// one second 
    //and lately reset the value of to_change to false and update the GUI again 
    to_change = false; 
    //UpdateGUI. 
} 

そしてUpdateGUIで私が持っている:また、私は、私はいくつかの重要な概念が欠けていると思い、最優先

あるDispatcherPriority.Sendで

private void UpdateGUI() 
    { 
     this.Dispatcher.BeginInvoke(DispatcherPriority.Normal, 
      (ThreadStart)delegate() 
      { 
       this.label_success.Content = "Successful!"; 
      } 
      ); 
    } 

を試してみました。

ありがとうございます!

+0

これは悪いコードです –

+2

**決して** UIスレッドでスリープします。あなたは何を達成したいですか? – Clemens

+0

@Clements私は、理解を深めるために質問を編集しました。あなたが私がしようとしていることを理解できない場合は、私に知らせてください。 –

答えて

0

実行するタスクの優先度よりも低いか等しい優先度を持つ項目をディスパッチャに呼び出すことで、WPFがキュー内のすべてのアイテムを強制的に処理できるようにすることができます。このようにアクションとして空のデリゲートを渡すだけです。

Dispatcher.CurrentDispatcher.Invoke(DispatcherPriority.Normal, new Action(delegate { })); 

これは動作します。しかし、これを行うべきではありません "通常"、私はあなたのメインのUIスレッドをスリープ状態にする必要があるのが不思議です...あなたが上に示したコードは怖いですが、私は大きな画像を知らないので、これの理由?

+0

ありがとう@davisoa。あなたは、メインスレッドをスリープ状態にするのは悪い習慣だと言いますか?ある一定の期間静的変数を設定して、ウィンドウのラベルにメッセージを表示したい。その期間の後、もう一度古い値に設定したいと思います。 –

+1

次に、その期間の後にTickし、Tickイベントハンドラの値をリセットするDispatcherTimerを設定します。 – Robaticus

+0

それは私が@ロバティカスを探しているものです。どうもありがとうございました!。 –

関連する問題