locked
Сохранение изображений, ObservableCollection, MVVM RRS feed

  • Общие обсуждения

  • Решил все-таки вынести в отдельный вопрос.

    Как сохранять изображения в коллекции? Чтобы в случае повторного запуска приложения без интернета, картинки сразу отображались в списке

    Заодно спрошу как сделать изображение-заглушку во время загрузки основной картинки с url.

    Хотелось бы сделать так же как в приложении Mehdoh ... буду рад любой помощи




    18 февраля 2013 г. 13:56

Все ответы

  • А сами новости у вас как хранятся? Или у вас только картинки без текста?
    18 февраля 2013 г. 15:10
  • При выходе из приложения создается файл в IsolatedStorage и с помощью XmlSerializer туда записывается XML(Serialize) соответствующая моей ViewModel, естественно со всеми текстами. При запуске приложения делается обратное преобразование(Deserialize). И присвоение RootFrame.DataContext = ViewModel. 

    • Изменено ProstoKorol 18 февраля 2013 г. 15:46
    18 февраля 2013 г. 15:44
  • Все правильно, вам осталось сохранить только картинки в IsolatedStorage, а перед тем, как сериализовать свой ViewModel, поправить в нем пути с URL на локальные пути.

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

    19 февраля 2013 г. 6:48
    Отвечающий
  • 2Алексей, алгоритм понимаю, но мне видимо не хватает практики, чтобы описать этот алгоритм кодом... Как мне в уже созданной коллекции что-то заменять или перезаписывать? В том плане как связать картинку с определенной новостью!? По GUID'у картинки, который мне возвращает сервер? То есть еще нужно создавать дополнительно какой-нибудь Dictonary<string, BitmapImage>, а потом проходится foreach'ем по коллекции и искать GUID и вставлять картинку!? Даже если полет мысли моей правильный, я все равно не понимаю как это описать =) Может кто-нибудь показать просто небольшой пример работы данного алгоритма!? 


    • Изменено ProstoKorol 19 февраля 2013 г. 16:54
    19 февраля 2013 г. 7:43
  • Пока сделал, так: 

    foreach (var feedItem in _feedItems)
                    {
    
                        var imagePath = feedItem.Image.UriSource.AbsolutePath;
                       
                        int lastIndex = imagePath.LastIndexOf("/");
                        var path = imagePath.Substring(0, lastIndex - 1);
                        var IMAGE_NAME = imagePath.Substring(lastIndex + 1);
    
                        Byte[] binaryData;
                        WebClient wc = new WebClient();
                        wc.OpenReadAsync(feedItem.Image.UriSource);
                        wc.OpenReadCompleted += (o, args) =>
                                                    {
                                                        Stream stream = args.Result;
                                                        binaryData = new Byte[stream.Length];
                                                        stream.Read(binaryData, 0, (int)stream.Length);
                                                        stream.Close();
    
    
                                                        if (!_fileStorage.DirectoryExists(path))
                                                            _fileStorage.CreateDirectory(path);
    
                                                        using (IsolatedStorageFileStream fileStream =
                                                            _fileStorage.OpenFile(@path + "\\" + IMAGE_NAME,
                                                                                  FileMode.OpenOrCreate))
                                                        {
                                                            fileStream.Write(binaryData, 0, binaryData.Length);
                                                        }
                                                    };
                    }

    _feedItems - это ObservableCollection, поле Image в коллекции это BitmapImage. Файлы вроде сохраняются, но я не понимаю как  в коллекции переписать url путь к файлу на локальный путь и как  декодировать изображение перед выводом... 

    путь до изображения по умолчанию такой http://storage.server.ru/files/details/guid


    AbsolutePath = "/files/details/guid

    отсюда я создаю директории files, в ней details и уже там создаю файлы, где их имя - это их же guid с сервера



    • Изменено ProstoKorol 19 февраля 2013 г. 17:02
    19 февраля 2013 г. 16:57
  • поменял я пути в коллекции, но почему то картинки все равно не отображаются... локальный путь такой file://file/detail/54319603-4056-4758-b020-fa7af1846020.png в AbsolutePath у UriSource режется на /detail/54319603-4056-4758-b020-fa7af1846020.png... думаю из-за этого картинки не выводятся...подскажите, пожалуйста, как это поправить!? 

    Кстати, может лучше в случае сохранения изображений использовать SqlLite?? и хранить там бинарные данные файла?!

    • Изменено ProstoKorol 20 февраля 2013 г. 12:18
    20 февраля 2013 г. 11:16
  • Уважаемый пользователь!

    В вашей теме отсутствует активность в течение последних 5 дней. При отсутствии каких-либо действий в течение 2 последующих дней, тема будет переведена в разряд обсуждений. Вы можете возобновить дискуссию, просто оставив сообщение в данной теме


    Для связи [mail]

    25 февраля 2013 г. 6:19
  • Сейчас успешно сохраняю изображения в base64. И используя IValueConverter вывожу их на странице.

    Вопрос в следующем: лучше конвертировать изображения в base64 и обратно или все таки хранить в сторадже файлы целиком!?

    Заодно спрошу, как при сериализации указать, что необходимо сохранить например 6 записей коллекции. Сейчас это выглядит так и сохраняются абсолютно все записи.

     using (var store = IsolatedStorageFile.GetUserStoreForApplication())
                using (var stream = new IsolatedStorageFileStream("data.txt", FileMode.Create, FileAccess.Write, store))
                {
                    var serializer = new XmlSerializer(typeof(AppViewModel.FeedViewModel));
                    serializer.Serialize(stream, ViewModel);
                }

    где AppViewModel.FeedViewModel это следующее:

     public class FeedViewModel
            {
                private int _currentEndIndexEps;
    
                private readonly string _epsUrl = "http://server.ru/mapp/?token=123";
    
                private WebClient _webClient = new WebClient();
    
                private readonly ObservableCollection<FeedItemViewModel> _feedItems = new ObservableCollection<FeedItemViewModel>();
    
                IsolatedStorageFile _fileStorage = IsolatedStorageFile.GetUserStoreForApplication();
    
                public FeedViewModel()
                {
                    _webClient.DownloadStringCompleted += _webClient_DownloadStringCompleted;
                }
    
    
               
                void _webClient_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
                {
                    var doc = XDocument.Parse(e.Result);
    // разбор xml и запись в коллекцию
                    
                }
    
    
               /// <summary>
               /// Коллекция элементов FeedItemViewModel
               /// </summary>
                public ObservableCollection<FeedItemViewModel> FeedItems
                {
                    get { return _feedItems; }
                }
    
    
                public FeedItemViewModel GetFeedItem(int id)
                {
                    return _feedItems.SingleOrDefault(item => item.Id == id);
                }
    
                
                public void Update(int count)
                {
                    if (((App)Application.Current).ViewModel.FeedItems.Count > 0)
                        _currentEndIndexEps = ((App)Application.Current).ViewModel.FeedItems.Count;
    
                    _webClient.DownloadStringAsync(new Uri(String.Format(_epsUrl + "&count={0}" + "&skip={1}", count, _currentEndIndexEps)), "GET");
                }
    
                
                
            }



    • Изменено ProstoKorol 25 февраля 2013 г. 15:00
    25 февраля 2013 г. 14:52
  •  Насчет сохранения... сейчас файлы сохраняются по пути @"\shared\media\" все работает шикарно, что на эмуляторе WP8, так и на моей 800-ой, где уже стоит 7.8. Сейчас попробовал запустить на эмуляторе 7.8 и приложение свалилось с ошибкой: "path must be a valid file name." Что за беда!?? 
    2 марта 2013 г. 6:45
  • Уважаемый пользователь!

    В вашей теме отсутствует активность более 5 дней. Тема будет переведена в разряд обсуждений. Вы можете возобновить дискуссию, просто оставив сообщение в данной теме

    19 марта 2013 г. 13:23