2011-01-27 1 views
4

СценарийПроблема открытия JPEG из изолированного хранилища на Windows Phone 7

  1. App открывает
  2. Проверяет, существует ли изображение для фона в изолированном хранилище
  3. Если нет, загружает из Интернета и сохраняет к изолированному хранилищу
  4. Загружает изображение из изолированного хранилища и устанавливает его как фоновое изображение на управление панорамой

Проблема

Изображение не загружено в графическом интерфейсе .. Когда я проверки байт-массива, полученные от изолированного хранилища, она содержит такое же количество байтов, как была написана изначально, но изображение не объявиться.

Вот некоторый тест-код, который я сейчас использую, чтобы попытаться выяснить проблему:

using (IsolatedStorageFile appStorage = IsolatedStorageFile.GetUserStoreForApplication()) 
      { 
       if (!appStorage.FileExists(@"default.jpg")) 
       { 
        BitmapImage bmp = sender as BitmapImage; 
        byte[] bytes = bmp.ConvertToBytes(); 
        using (var inputfile = appStorage.CreateFile(@"default.jpg")) 
        { 
         inputfile.Write(bytes, 0, bytes.Length); 
        } 
       } 
       using (var isfs = appStorage.OpenFile(@"default.jpg", FileMode.OpenOrCreate, FileAccess.Read)) 
       { 
        BitmapImage bmp = new BitmapImage(); 
        bmp.SetSource(isfs); 
        MainPanorama.Background = new ImageBrush { Opacity = 0.4, Stretch = Stretch.None, ImageSource = bmp }; 
       } 
      } 

Где sender это заряженное изображение из другого источника Я попытался установить отправитель как BackgroundImage на MainPanorama-control, и это работает отлично. Поэтому проблема заключается в загрузке из изолированного хранилища.

Любые идеи?

ответ

2

Редактировать: похоже, что это должно быть проблемой с синхронизацией или со случайным доступом к потоку.

Вещи, которые вы можете попробовать:

  1. Попробуйте загрузить все изображения в в массиве памяти - это MemoryStream - и затем использовать его в SetSource вызова

  2. Попробуйте удалить неиспользуемый код; - .ImageОткрытый делегат и вызов img = new Image()

  3. Если эти вещи не помогают, попробуйте проверить два потока на уровне байта.

Для получения дополнительной информации по 1 см How Do I Load an Image from Isolated Storage and Display it on the Device? - обратите внимание, что это поддержка официальный образец Microsoft, и он загружает изображение в памяти в MemoryStream, прежде чем использовать его в изображение на экране.

код от Microsoft:

// The image will be read from isolated storage into the following byte array 
     byte [] data; 

     // Read the entire image in one go into a byte array 
     using (IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication()) 
     { 
      // Open the file - error handling omitted for brevity 
           // Note: If the image does not exist in isolated storage the following exception will be generated: 
      // System.IO.IsolatedStorage.IsolatedStorageException was unhandled 
      // Message=Operation not permitted on IsolatedStorageFileStream 
      using (IsolatedStorageFileStream isfs = isf.OpenFile("WP7Logo.png", FileMode.Open, FileAccess.Read)) 
      { 
       // Allocate an array large enough for the entire file 
       data = new byte[isfs.Length]; 

       // Read the entire file and then close it 
       isfs.Read(data, 0, data.Length); 
       isfs.Close(); 
      } 
     } 

     // Create memory stream and bitmap 
     MemoryStream ms = new MemoryStream(data); 
     BitmapImage bi = new BitmapImage(); 

     // Set bitmap source to memory stream 
     bi.SetSource(ms); 

     // Create an image UI element – Note: this could be declared in the XAML instead 
     Image image = new Image(); 

     // Set size of image to bitmap size for this demonstration 
     image.Height = bi.PixelHeight; 
     image.Width = bi.PixelWidth; 

     // Assign the bitmap image to the image’s source 
     image.Source = bi; 

     // Add the image to the grid in order to display the bit map 
     ContentPanel.Children.Add(image); 

Пожалуйста, доложить о том, что установил ее.

+0

Я редактировал код, так как изображение-бит был не предназначен, чтобы быть там.Еще нет решения, хотя ... Я попробую еще немного. –

+0

обновил мой ответ выше - см. Http://forums.create.msdn.com/forums/t/73544.aspx – Stuart

0

Я предполагаю, что это вопрос времени. Вызывается ли этот код, прежде чем пользовательский интерфейс будет готов отображать изображения? Если визуальное дерево не полностью загружено, я не уверен, что произойдет, когда вы установите источник изображения.

Try что-то вроде этого псевдо-код:

MyPage() { this.Loaded +=() => YourImageLoadMethod; InitializeComponent(); }