2

MvvmCross フレームワークを使用して最初の Windows ストア アプリを開発していますが、イメージ管理に問題があります。特に、私の PCL プロジェクトには次の単純な ViewModel があり、ボタンが AddPictureCommand にバインドされた Store プロジェクトがあります。

    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」とメッセージが表示されます:「これを実装する必要があります-StorageFolder APIからは明らかではないようです」。誰かがすでにそれを見たことがありますか?ありがとうございました

4

2 に答える 2

1

Stuart の提案に従って、Windows 8 ストア アプリに次のメソッドを実装しました。

        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();
    }

実装する必要がある 3 番目のメソッドは、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");
    }

または、「再帰的」が false の場合、削除する前にフォルダーが空かどうかを確認する必要があります。より良い実装を歓迎します。

于 2013-11-12T06:57:27.213 に答える
1

この実装されていない例外は wiki に記載されています - https://github.com/MvvmCross/MvvmCross/wiki/MvvmCross-plugins#Fileを参照してください

これらの不足しているメソッドが必要な場合、それらを実装するのはかなり簡単です。実際、私は少なくとも 2 人のユーザーがこれらを実装していることを知っていますが、残念ながら彼らはそれらを提供していません。

それらを実装するには、ただ

ioc の使用の詳細については、https: //github.com/MvvmCross/MvvmCross/wiki/Service-Location-and-Inversion-of-Control を参照してください。

セットアップ シーケンスのカスタマイズの詳細については、https://github.com/MvvmCross/MvvmCross/wiki/Customising-using-App-and-Setupを参照してください。

于 2013-11-10T14:42:32.010 に答える