如果图像未加载,则从长列表选择器中删除项目

时间:2014-03-17 07:30:40

标签: c# xaml windows-phone-8 windows-phone longlistselector

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个图像链接

由于

1 个答案:

答案 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]);
        }
    }
}

也许这不是最好的代码,但应该给你一些想法。