2

UIElement.Visibility プロパティについて質問があります。

「StartAll」ボタンがクリックされると、次のコードが実行されます。

private void butStartAllClick(object sender, RoutedEventArgs e)
    {
        butStartAll.Content = "Running";

        LEDInitializing.Visibility = Visibility.Visible;
        lblInitializing.Visibility = Visibility.Visible;

        Init();

        //...rest of code
    }

次に、Init は長い初期化ルーチンを開始します。私の問題は、表示属性がInit()メソッドの最後でのみ変更されることです。

すぐに更新するにはどうすればよいですか?

Dispatcher を次のように使用してみました。

    LEDInitializing.Dispatcher.BeginInvoke(
                System.Windows.Threading.DispatcherPriority.Normal,
                                   new Action(
                                       delegate()
                                       {
                                           LEDInitializing.Visibility = Visibility.Visible;
                                       }
                                       ));

しかし、これは私の問題を解決しません。

どんな支援も大歓迎です:)

4

1 に答える 1

2

UI スレッドで実行Initすることにより、UI の変更が完了して終了するまで実行されないようにしbutStartAllClickます。内容によってはInit、別のスレッドで実行できる場合があります (ここでは 4.5、4.0 で使用TaskFactory):

private void butStartAllClick(object sender, RoutedEventArgs e)
{
    butStartAll.Content = "Running";

    LEDInitializing.Visibility = Visibility.Visible;
    lblInitializing.Visibility = Visibility.Visible;

    Task.Run(() =>
    {
        Init();
        //...rest of code
    });
}

または次のコードが UI と対話する必要があることを行っている場合Initは、それを分割し、UI へのコールバックを使用して、必要に応じてこれらの更新を行う必要があります。通常、4.5のパターンはこれを行う最も簡単な方法ですが、手動で継続async/awaitを設定することで 4.0 でも同じ効果を得ることができます。Task

于 2013-02-04T17:40:29.720 に答える