0

私はWPF TabControl2 つを持っていTabItemsます。クリック イベントのコード ビハインドで選択したタブを変更し、Button他のコードを実行しようとしています。この例では:

private void Button_Click(object sender, RoutedEventArgs e)
{
    ConvertDataTabControl.SelectedIndex = 1;
    System.Threading.Thread.Sleep(2000);
    ...
}

Tab 0UI が更新されてから移動し、その後 Sleep メソッドを実行することを期待しますTab 1が、UI は実行が終了した後にのみ更新されButton_Clickます。に電話InvalidateVisualしてみましたが、うまくいきません。

実行する前に UI を強制的に更新する方法はありSleepますか?

4

3 に答える 3

2

コードはデフォルトで UI スレッドで実行されるため、スレッドの実行が完了するまで、UI スレッドで実行できるものは他にありません (レイアウトの更新など)。

コードの実行が完了する前に UI スレッドの制御を解放する方法はたくさんありますが、最も簡単なのは、別のスレッドでコードを実行するために使用できるTask Parallel LibraryTaskのを使用することです。

例えば、

Task.Factory.StartNew(() =>
{
    Thread.Sleep(2000);

    // Other code here
});

UI オブジェクトは UI スレッドでのみ変更できることに注意してください。そのため、「ここにあるその他のコード」が UI オブジェクトを更新する場合は、次のようにDispatcherを使用して UI スレッドでコードを実行することをお勧めします。

Dispatcher.BeginInvoke(() =>
{
    // Code to update the UI
});
于 2013-03-21T14:56:16.900 に答える
1

試す

Dispatcher.BeginInvoke(()=>
{
    ConvertDataTabControl.SelectedIndex = 1;
});
于 2013-03-21T13:45:07.980 に答える