3

DomainDataSourceがデータをフェッチすると、BusyIndi​​catorは期待どおりに機能します。しかし、コードでIsBusyをtrueに設定すると、コントロールは非表示のままになります。

私はSilverlight4とツールキットBusyIndi​​catorを使用しています。XAMLでは、BusyIndi​​cator.IsBusyプロパティをDomainDataSourceコントロールのIsBusyプロパティにバインドしました。BusyIndi​​catorコントロールは、メインのグリッド(LayoutRoot)とすべての子コントロールをラップします。

<toolkit:BusyIndicator IsBusy="{Binding ElementName=labSampleDomainDataSource, Path=IsBusy}"  Name="busyIndicator1">
<Grid x:Name="LayoutRoot">

</Grid>
</toolkit:BusyIndicator>

問題は、busyIndi​​cator1 = trueに設定すると、BusyIndi​​catorが表示されないことです。ボタンクリックイベントで。私が間違っていることについて何か考えはありますか?

4

1 に答える 1

7

UIは、UIスレッド上で非常に自然に更新されます。ボタンクリックなどのイベントもUIスレッドで実行されます。

場合によっては、プロパティの変更やコントロールへのメソッド呼び出しにより、UIスレッドにメソッドがディスパッチされます。これが意味するのは、呼び出されるメソッドは、UIスレッドがそれを実行できるようになるまで(そしてすでにキューに入れられている他のものが実行されるまで)実際には発生しないということです。 IsBusyこのカテゴリに分類されます。

コードがUIスレッドで終了した場合にのみ、UIはその外観を更新する機会を得ます。UIスレッドで長時間実行されるタスクを実行しないでください。あなたの場合、あなたはあなた自身の入札をするためにスレッドを縛り、そしてそれがその仕事を成し遂げるために使うことができるこの1つのスレッドをUIに飢えさせたままにします。

代わりに、クラスを使用して、別のスレッドで実行されるイベントでBackgroundWorkerすべての重い作業を行う必要があります。DoWork

myButton_Click(object sender, RoutedEventArgs e)
{
    isbusyindicator1.IsBusy = true;
    var bw = new BackgroundWorker();
    bw.DoWork += (s, args) =>
    {
       //Stuff that takes some time
    };
    bw.RunWorkerCompleted += (s, args) =>
    {
         isbusyindicator1.IsBusy = false;
    };
    bw.RunWorkerAsync();
}

これで、このクリックイベントは非常に迅速に完了し、実際の作業がバックグラウンドスレッドで実行されている間に、UIスレッドを使用してUIを更新できるようになります。完了すると、IsBusyがクリアされます。

于 2011-01-25T18:17:31.963 に答える