По вашему вопросу у меня есть кое-что, чтобы уточнить с вами.
- Ваши изображения всегда находятся в папке данных приложения. Если вы хотите показать его во время выполнения с помощью программирования, проще всего использовать схему URI ms-appdata для обращения к файлам, которые поступают из локальных, перемещаемых и временных папок данных приложения. Затем вы можете использовать этот URL для инициализации объекта
BitmapImage
. Таким образом, вам не нужно вручную манипулировать потоком файлов.
private void setImageSource(int i)
{
BitmapImage bi = new BitmapImage(new Uri("ms-appdata:///local/"+i+".png"));
image1.Source = bi;
}
private int count = 0;
private void Button_Click(object sender, RoutedEventArgs e)
{
if (count % 2 == 1)
{
setImageSource(1);
}
else
{
setImageSource(2);
}
count++;
}
- Если вы говорите, что вам нужно манипулировать потоком файлов для инициализации BitmaImage, то добавьте несколько точек останова для отладки вашего кода. Если вы добавите точки останова для проверки метода
InMemoryRandomAccessStream
после вызова CopyToAsync
, вы увидите, что его размер равен 0. Это означает, что поток файлов не был записан в него. Чтобы решить эту проблему, вам нужно установить для нее размер буфера. Примечание: вы использовали ras.AsStreamForRead()
метод, он неверный. Вы записываете поток на него, поэтому вам нужно позвонить ras.AsStreamForWrite()
.
Код выглядит следующим образом:
private async void setImageSource(string imageFilePath)
{
StorageFile sFile = await StorageFile.GetFileFromPathAsync(imageFilePath);
using (Stream fileStream = await sFile.OpenStreamForReadAsync())
{
using (InMemoryRandomAccessStream ras = new InMemoryRandomAccessStream())
{
await fileStream.CopyToAsync(ras.AsStreamForWrite((int)fileStream.Length));
ras.Seek(0);
BitmapImage bi = new BitmapImage();
bi.SetSource(ras);
img.Source = bi;
}
}
}
private int count = 0;
private void Button_Click(object sender, RoutedEventArgs e)
{
string fullFolder = ApplicationData.Current.LocalFolder.Path;
if (count % 2 == 1)
{
setImageSource(fullFolder + @"\1.jpg");
}
else
{
setImageSource(fullFolder + @"\2.jpg");
}
count++;
}
Кроме того, как сказал @visc, вам нужно вызвать метод ras.Seek(0)
, чтобы сбросить поток в начало, иначе изображение там не будет отображаться.