Hello在我的WP8应用程序中,我从Web API获取数据,然后将我的longlistselector的Itemsource设置为Class的实例。
问题在于API有时会在实际创建图像之前发送图像链接,因此当查看列表中选择的图片绑定到类中的网址时,它会变黑并且不会加载... < / p>
现在我的问题是,是否有某种方法可以过滤掉这些帖子以便它们不显示,图像不会加载到代码后面但仅在应用程序运行时在XAML中加载..
编辑:
将添加一些代码并更好地解释:
我使用webclient从服务器下载Json文件,然后使用Json.net将其反序列化到我的类中,如下所示:
string jsonstring = e.Result.ToString();
Latest lastdownloaded = JsonConvert.DeserializeObject<Latest>(jsonstring);
我的班级看起来像这样:
public class Latest
{
public string ThumbLink{ get; set; }
public int Id { get; set; }
public string Title { get; set;
}
然后我将我的长列表选择器的项目源设置为实例
latestlonglist.ItemsSource = lastdownloaded;
然后我的xaml看起来像这样:
<phone:LongListSelector x:Name="latestlonglist" Margin="0,0,-12,0" ItemsSource="{Binding Items}" SelectionChanged="latestlonglist_SelectionChanged">
<phone:LongListSelector.ItemTemplate>
<DataTemplate>
<StackPanel Margin="0,0,0,17">
<Grid Height="160">
<TextBlock x:Name="titleBlock" Text="{Binding Title}" TextWrapping="Wrap" Margin="145,0,0,0" Style="{StaticResource PhoneTextExtraLargeStyle}" FontSize="26" Height="105" VerticalAlignment="Top"/>
<Image x:Name="latestListImage" Source="{Binding ThumbLink}" VerticalAlignment="Top" HorizontalAlignment="Left" Width="140" />
</Grid>
</StackPanel>
</DataTemplate>
</phone:LongListSelector.ItemTemplate>
</phone:LongListSelector>
json包含40个图像链接
由于
答案 0 :(得分:1)
好的,没有代码所以我只能猜测。我猜你有ObservableCollection<>
个包含ViewModel中图片对象的对象。
您应该制作和异步方法下载图片并将其存储在BitmapImage中。
在ViewModel中,您可以使用for
循环浏览图像链接并使用await
启动下载的方式加载数据,并将其添加到ObservableCollection<>
。这样,您的ObservableCollection<>
项目只会在下载后添加,并解决黑方问题。
这是你的班级:
class Latest
{
public string ThumbLink { get; set; }
public BitmapImage Thumb { get; set; }
public int Id { get; set; }
public string Title { get; set; }
public async Task<bool> LoadThumbAsync()
{
WebClient client = new WebClient();
client.OpenReadAsync(new Uri(this.ThumbLink));
client.OpenReadCompleted += (s, e) => //Wait for completion
{
var tempBitmap = new BitmapImage(); //Create temp bitmap container
tempBitmap.SetSource(e.Result); //Copy stream to bitmap container
this.Thumb = tempBitmap;
e.Result.Close();
return;
};
return true; // return bool only to be able to await this method.
}
}
class ViewModel
{
ObservableCollection<Latest> lastdownloaded = new ObservableCollection<Latest>();
ObservableCollection<Latest> allItems = new ObservableCollection<Latest>();
public async void LoadData()
{
//Here you load all your thumbs in list allItems. This is only temporary container.
for (var i = 0; i < allItems.Count; i++) // Now here for every item in that container you load thumb and add it to lastdownloaded list which you bind to Long List Selector.
{
await allItems[i].LoadThumbAsync();
lastdownloaded.Add(allItems[i]);
}
}
}
也许这不是最好的代码,但应该给你一些想法。