0

私のWP8アプリでは、Background Transfer Seviceを使用LongListSelectorProgressBarており、DataTemplateアイテムのダウンロードの進行状況をユーザーに表示します。問題は、ProgressBar実際の進捗状況は表示されないが、前後にジャンプし続けることです。

これが私のXAMLです。LongListSelector定期的にのリストを受け取り、それらを表示するためにBackgroundTransferRequest使用 します。ProgressBar

<phone:LongListSelector IsGroupingEnabled="False" x:Name="Views">
    <phone:LongListSelector.ListHeader>
        <StackPanel Style="{StaticResource M20}">
            <controls:TextTile Txt="Cancel downloads" Sign="x" Tap="CancelDownloads" />
        </StackPanel>
    </phone:LongListSelector.ListHeader>
    <phone:LongListSelector.ItemTemplate>
        <DataTemplate>
            <ProgressBar Maximum="{Binding TotalBytesToReceive}" Value="{Binding BytesReceived}" Minimum="0" />
        </DataTemplate>
    </phone:LongListSelector.ItemTemplate>
</phone:LongListSelector>  

LongListSelectorクラスの背後にあるコードから定期的に更新されます:

Views.ItemsSource = BackgroundTransferService.Requests.ToList()

この問題は、LongListSelector複数のアイテムが表示されている場合にのみ発生します。ListBoxたとえば、使用しようとすると、すべて正常に動作します。なぜこのようなことが起こっているのですか、それを修正するにはどうすればよいですか?

4

1 に答える 1

1

私はこれをコメントに収めることができませんでした-これを試してください:

public class BackgroundTransferRequestWrapper : INotifyPropertyChanged {

    private BackgroundTransferRequest _request;

    public BackgroundTransferRequestWrapper(BackgroundTransferRequest request) {
        _request = request;
        _request.TransferProgressChanged += OnTransferProgressChanged;
    }

    private void OnTransferProgressChanged(object sender, BackgroundTransferEventArgs e) {
        BytesReceived = _request.BytesReceived;
        TotalBytesToReceive = _request.TotalBytesToReceive;
    }

    private long bytesReceived = 0;
    public long BytesReceived {
        get { return bytesReceived; }
        set {
            bytesReceived = value;
            OnPropertyChanged();
        }
    }

    private long totalBytesToReceive = 0;
    public long TotalBytesToReceive {
        get { return totalBytesToReceive; }
        set { totalBytesToReceive = value;
        OnPropertyChanged();}
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
            handler(this, new PropertyChangedEventArgs(propertyName));
    }
}

タイマーでItemsSourceをリセットする代わりに、次のようにします。

    foreach (var request in BackgroundTransferService.Requests) {
        Requests.Add(new BackgroundTransferRequestWrapper(request));
    }

この例では、RequestsはItemsSourceにバインドされたObservableCollectionです。これにより、手動で更新する必要はまったくありません。BackgroundTransferRequestイベントは、ラッパーを駆動して、プロップの変更が発生したときに通知します。

私はあなたの例を完全にテストしませんでしたが、あなたの問題はLongListSelectorのUI仮想化とItemsSourceを絶えずリセットしている方法に関係していると思います。もう1つの可能性は、BackgroundTransferServiceからリクエストを取得するたびにリクエストの順序が変わる可能性があることです。

幸運を!

于 2013-03-01T14:12:26.090 に答える