Хорошо ... понял!
Сначала, чтобы прочитать конкретную запись, используйте ZipArchiveEntry.GetEntry (entrytosearch);
Во-вторых, я не могу прочитать ZipArchiveEntry в IRandomAccessStream, я не знаю почему ... возился с ним некоторое время, прежде чем решил сначала прочитать его в памяти. Поскольку то, что я делаю, - это чтение изображений для отображения на экране, это оказывает ограниченное влияние на управление памятью. Однако остерегайтесь размера, если вы читаете что-то большое. Я бы поставил галочку на. Длине записи, прежде чем читать ее. Однако, для упрощения, здесь приведен обновленный код для чтения определенной записи ".jpg" файла zip в Image.Source.
Пока еще не элегантно или изысканно, но я надеюсь, что это сэкономит кому-то время, которое я потратил на эту игру!
public class ZipItem
{
public StorageFile motherfile { get; set; }
public ZipArchiveEntry motherentry { get; set; }
public string Name { get; set; }
public string ActualBytes { get; set; }
public string CompressedBytes { get; set; }
}
public List<ZipItem> results;
public int i = 0;
private async void nextimg_Click(object sender, RoutedEventArgs e)
{
//Open the zip file. I previously stored all zip files and stored them in the "results" a list of ZipItems populated in another method
Stream stream = await results[i].motherfile.OpenStreamForReadAsync();
using (ZipArchive archive = new ZipArchive(stream, ZipArchiveMode.Read))
{
//look for the entry "i", which is my current slideshow position
ZipArchiveEntry entry = archive.GetEntry(results[i].motherentry.Name);
//Open the entry as a stream
Stream fileStream = entry.Open();
//Before I read this in memory, I do check for entry.Length to make sure it's not too big.
//For simplicity purposes here, I jsut show the "Read it in memory" portion
var memStream = new MemoryStream();
await fileStream.CopyToAsync(memStream);
//Reset the stream position to start
memStream.Position = 0;
//Create a BitmapImage from the memStream;
BitmapImage bitmapImage = new BitmapImage();
bitmapImage.DecodePixelHeight = (int)ctlImage.Height;
bitmapImage.DecodePixelWidth = (int)ctlImage.Width;
//Set the source of the BitmapImage to the memory stream
bitmapImage.SetSource(memStream.AsRandomAccessStream());
//Set the Image.Source to the BitmapImage
ctlImage.Source = bitmapImage;
}
}
}