2013-11-10 4 views
2

Я разрабатываю свое первое приложение для Windows Store, используя фреймворк MvvmCross, и у меня проблема с управлением изображениями. В частности, у меня есть следующий простой ViewModel в моем проекте PCL и проект Store с кнопкой, связанной с AddPictureCommand.MvvmCross: NotImplementedException вызывает метод EnsureFolderExists для IMvxFileStore

public class FirstViewModel : MvxViewModel 
{ 

    IMvxPictureChooserTask _pictureChooserTask; 
    IMvxFileStore _fileStore; 

    public FirstViewModel(IMvxPictureChooserTask pictureChooserTask, IMvxFileStore fileStore) 
    { 
     _pictureChooserTask = pictureChooserTask; 
     _fileStore = fileStore; 
    } 

    private byte[] _pictureBytes; 
    public byte[] PictureBytes 
    { 
     get { return _pictureBytes; } 
     set 
     { 
      if (_pictureBytes == value) return; 
      _pictureBytes = value; 
      RaisePropertyChanged(() => PictureBytes); 
     } 
    } 

    public ICommand AddPictureCommand 
    { 
     get { return new MvxCommand(() => 
     { 
      _pictureChooserTask.ChoosePictureFromLibrary(400, 95, pictureAvailable,() => { }); 
     }); } 
    } 

    private void pictureAvailable(Stream stream) 
    { 
     MemoryStream memoryStream = new MemoryStream(); 
     stream.CopyTo(memoryStream); 
     PictureBytes = memoryStream.ToArray(); 

     GenerateImagePath(); 
    } 

    private string GenerateImagePath() 
    { 
     if (PictureBytes == null) return null; 
     var RandomFileName = "Image" + Guid.NewGuid().ToString("N") + ".jpg"; 
     _fileStore.EnsureFolderExists("Images"); 
     var path = _fileStore.PathCombine("Images", RandomFileName); 
     _fileStore.WriteFile(path, PictureBytes); 

     return path; 
    } 
} 

Проблема заключается в том, что метод _fileStore.EnsureFolderExists ("Images"); дает мне сообщение NotImplementedException с сообщением: «Необходимость реализовать это - не кажется очевидным из API StorageFolder». Кто-нибудь уже видел это раньше? Спасибо

ответ

1

Это не реализовано исключение документируется в вики - см https://github.com/MvvmCross/MvvmCross/wiki/MvvmCross-plugins#File

Это должно быть довольно просто реализовать эти методы отсутствующих, если они необходимы. Действительно, я знаю, по крайней мере, 2 пользователей, которые их реализовали, но, к сожалению, они не вернули их.

для их реализации, только

  • вилки (копия) код из https://github.com/MvvmCross/MvvmCross/blob/v3/Plugins/Cirrious/File/Cirrious.MvvmCross.Plugins.File.WindowsStore/MvxWindowsStoreBlockingFileStore.cs
  • реализовать недостающие методы с использованием WinRT StorageFolder APIs
  • в проекте Магазина UI, не нагружает File plugin - так что закомментируйте или удалите класс начальной загрузки File.
  • во время установки, зарегистрировать реализацию с МОК, используя Mvx.RegisterType - например:

    protected override void InitializeFirstChance() 
    { 
        base.InitializeFirstChance(); 
    
        Cirrious.CrossCore.Mvx.RegisterType<IMvxFileStore, MyFileStore>(); 
    } 
    

Для дополнительной информации об использовании МОК см https://github.com/MvvmCross/MvvmCross/wiki/Service-Location-and-Inversion-of-Control

Более подробную информацию о настройке последовательности установки см https://github.com/MvvmCross/MvvmCross/wiki/Customising-using-App-and-Setup

+0

Спасибо Стюарт. Не могли бы вы объяснить немного больше о третьем пункте (во время настройки ...)? Что мне нужно сделать с измененным классом MvxWindowsStoreBlockingFileStore? – AlexMortola

+0

Обновленный ответ с фрагментом – Stuart

1

Следуя советам Стюарта, я применил следующие методы для Windows 8 Store App:

 public bool FolderExists(string folderPath) 
    { 
     try 
     { 
      var directory = ToFullPath(folderPath); 
      var storageFolder = StorageFolder.GetFolderFromPathAsync(directory).Await(); 
     } 
     catch (FileNotFoundException) 
     { 
      return false; 
     } 
     catch (Exception ex) 
     { 
      MvxTrace.Trace("Exception in FolderExists - folderPath: {0} - {1}", folderPath, ex.ToLongString()); 
      throw ex; 
     } 
     return true; 
     //throw new NotImplementedException("Need to implement this - See EnsureFolderExists"); 
    } 

     public void EnsureFolderExists(string folderPath) 
    { 
     try 
     { 
      var directory = ToFullPath(folderPath); 
      var storageFolder = StorageFolder.GetFolderFromPathAsync(directory).Await(); 
     } 
     catch (FileNotFoundException) 
     { 
      var localFolder = ToFullPath(string.Empty); 
      var storageFolder = StorageFolder.GetFolderFromPathAsync(localFolder).Await(); 
      storageFolder.CreateFolderAsync(folderPath).Await(); 
     } 
     catch (Exception ex) 
     { 
      MvxTrace.Trace("Exception in EnsureFolderExists - folderPath: {0} - {1}", folderPath, ex.ToLongString()); 
      throw ex; 
     } 

     //throw new NotImplementedException("Need to implement this - doesn't seem obvious from the StorageFolder API"); 
     //var folder = StorageFolder.GetFolderFromPathAsync(ToFullPath(folderPath)).Await(); 
    } 

Третий метод, который нам нужно реализовать, - это DeleteFolder (string folderPath, bool recursive). К сожалению, метод StorageFolder «DeleteFolder» не имеет «рекурсивного» параметра. Таким образом, я должен выполнять DeleteFolder игнорируя его:

 public void DeleteFolder(string folderPath, bool recursive) 
    { 
     try 
     { 
      var directory = ToFullPath(folderPath); 
      var storageFolder = StorageFolder.GetFolderFromPathAsync(directory).Await(); 
      storageFolder.DeleteAsync().Await(); 
     } 
     catch (FileNotFoundException) 
     { 
      //Folder doesn't exist. Nothing to do 
     } 
     catch (Exception ex) 
     { 
      MvxTrace.Trace("Exception in DeleteFolder - folderPath: {0} - {1}", folderPath, ex.ToLongString()); 
      throw ex; 
     } 
     //throw new NotImplementedException("Need to implement this - See EnsureFolderExists"); 
    } 

или я должен проверить, если папка пуста, прежде чем удалить его, если «рекурсивный» равно ложь. Лучшая реализация приветствуется.

+0

Благодарим вас за отправку кода – Stuart

Смежные вопросы