0

私のプログラムでは、タイマーが0になったときにアプリをサービスに「接続」させ、「接続」中に進行状況リングを表示させるタイマーがあります。

プログレス リングがアクティブに設定されている機能が終了するまで、プログレス リングが「アクティブ」にならないように見えます。しかし、接続機能の完了を待っているため、進行状況リングが表示されません。

これを解決するためにさまざまな方法を試しましたが、これを機能させるための待機/タスク/ディスパッチに関する理解が不足しています。

ProgressRing と Connect 関数に関連するコードは次のとおりです。

vm.IsConnecting = true;

await Window.Current.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () => vm.Connect());

if (vm.ConnectionClear)
    this.Frame.Navigate(typeof(MainPage), vm);

vm.IsConnecting = false;

vm.IsConnecting は、ProgressRing の IsActive プロパティがバインドされているものです。

vm.IsConnecting が true に設定された直後に、progressRing を表示するにはどうすればよいですか?

私は WinRT をターゲットにしているため、ツールボックスは多少制限されていることに注意してください。

これの奇妙な点は、ボタン クリック用の EventHandler に上記とまったく同じコード ブロックがあり、それが本来あるべきだと思うように機能することです。つまり、ボタンがクリックされると、ProgressRing が表示され、プログラムが connect メソッドを実行し、完了すると ProgressRing が消えます。

private async void Connect_Clicked(object sender, RoutedEventArgs e)
{
    vm.IsConnecting = true;

    await Window.Current.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () => vm.Connect());

    if (vm.ConnectionClear)
        this.Frame.Navigate(typeof(MainPage), vm);

    vm.IsConnecting = false;
}
4

1 に答える 1

2

あなたが望むのは、次のようasyncに VM でメソッドを公開することだと思います。

public async Task ConnectAsync();

次のように使用できます。

vm.IsConnecting = true;

await vm.ConnectAsync();

if (vm.ConnectionClear)
    this.Frame.Navigate(typeof(MainPage), vm);

vm.IsConnecting = false;

原則として、 を使用することDispatcherは、設計が機能する必要があることを示しています。

于 2013-11-06T20:15:50.130 に答える