0

我有绑定图像+文本的列表框。当我添加 15 个项目时没有问题,但是当我添加更多项目 20 和更多时,我得到 System.IndexOutOfRangeException。我发现某个地方的列表框只能存储 32kb,所以我尝试使用 listview 并得到相同的 System.IndexOutOfRangeException。我在这里使用 ObservableCollection 可能会溢出,或者有人知道为什么我会得到 System.IndexOutOfRangeException?将项目添加到列表框时出现此异常。

    private ObservableCollection<BindingData> _rsMessages = new ObservableCollection<BindingData>();
    public ObservableCollection<BindingData> RSMessages
    {
        get { return _rsMessages; }
        set { _rsMessages = value; }
    }

public void initializeListboxRS()
    {
        foreach (var items in UniDB.returnListOfRSItems())
        {
            _rsMessages.Add(new BindingData
            {
                rssMessageText = items.tile,
                rssMessageDateTime = items.dateTime.ToString("dd.MM.yyyy - hh:mm"),
                rssMessageImage = ByteArrayToBitmapImage(items.image),
                rssMessageLink = items.link
            });
            OnPropertyChanged("RSMessages");
        }
    }


 private BitmapImage ByteArrayToBitmapImage(byte[] byteArray)
    {

        BitmapImage bitmapImage = new BitmapImage();
        InMemoryRandomAccessStream ms = new InMemoryRandomAccessStream();
        ms.WriteAsync(byteArray.AsBuffer());  //exception here
        ms.FlushAsync().AsTask().Wait();
        ms.Seek(0);
        bitmapImage.SetSource(ms);
        return bitmapImage;
    }
4

1 回答 1

0

您的方法实现缺少await关键字。试试下面的代码。

private async Task<BitmapImage> ByteArrayToBitmapImage(byte[] byteArray)
{
    var bitmapImage = new BitmapImage();

    var stream = new InMemoryRandomAccessStream();
    await stream.WriteAsync(byteArray.AsBuffer());
    stream.Seek(0);

    bitmapImage.SetSource(stream);
    return bitmapImage;
}

private ObservableCollection<BindingData> _rsMessages = new ObservableCollection<BindingData>();
public ObservableCollection<BindingData> RSMessages
{
    get { return _rsMessages; }
    set { _rsMessages = value; }
}

public async Task initializeListboxRS()
{
    foreach (var items in UniDB.returnListOfRSItems())
    {
        _rsMessages.Add(new BindingData
        {
            rssMessageText = items.tile,
            rssMessageDateTime = items.dateTime.ToString("dd.MM.yyyy - hh:mm"),
            rssMessageImage = await ByteArrayToBitmapImage(items.image),
            rssMessageLink = items.link
        });
        OnPropertyChanged("RSMessages");
    }
}

每当您调用方法时initializeListboxRS()使用await前缀。

于 2013-09-29T10:34:01.447 回答