Xaml ProgressBar包含在LongListSelector中时行为不正确
在我的WP8应用程序中,我使用后台传输服务和Xaml ProgressBar包含在LongListSelector中时行为不正确,xaml,progress-bar,windows-phone-8,longlistselector,background-transfer,Xaml,Progress Bar,Windows Phone 8,Longlistselector,Background Transfer,在我的WP8应用程序中,我使用后台传输服务和LongListSelector以及ProgressBar作为DataTemplate向用户显示项目下载进度。问题是,ProgressBar并没有显示真正的进度,而是不断地来回跳跃 这是我的XAMLLongListSelector定期接收BackgroundTransferRequest的列表和使用 ProgressBar要显示它们: <phone:LongListSelector IsGroupingEnabled="False" x:Name
LongListSelector
以及ProgressBar
作为DataTemplate
向用户显示项目下载进度。问题是,ProgressBar
并没有显示真正的进度,而是不断地来回跳跃
这是我的XAMLLongListSelector
定期接收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
才会出现此问题。例如,如果我尝试使用ListBox
,一切都正常。为什么会发生这种情况?我应该怎么做才能解决它?我无法在评论中说明这一点--请尝试以下方法:
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));
}
在本例中,请求是绑定到ItemsSource的可观察集合。这样,您根本不需要手动更新——BackgroundTransferRequest事件将驱动包装器在发生道具更改时通知它们
我没有完全测试您的示例,但我怀疑您的问题与LongListSelector的UI虚拟化以及您不断重置ItemsSource的方式有关。另一种可能性是,每次从BackgroundTransferService获得请求时,请求的顺序可能会改变
祝你好运 我接受了您的XAML,无法重新创建问题。它似乎工作得很好。ProgressBar看起来不确定吗?尝试设置ProgressBar.IsIndeterminate=false。也许你看到的问题的屏幕截图会有所帮助?我有个想法——你能为LongListSelector.ItemsSource绑定到的任何类型的对象发布类吗?(上面有BytesReceived和TotalByTestorReceive的东西)@GaryJohnson,ProgressBar不是中间的,它确实显示了进度,但做得不正确:在某一时刻它可以显示60%,在下一时刻显示30%,依此类推。它绑定到的类是BackgroundTransferRequest()
foreach (var request in BackgroundTransferService.Requests) {
Requests.Add(new BackgroundTransferRequestWrapper(request));
}