2

私は次のクラスを持っています:

 public class RecipeItem
{
    public Guid ID { get; set; }
    public string Title { get; set; }
    public string Instructions { get; set; }
    public string Ingredients { get; set; }
    public string ImagePath {get; set;}

    [XmlIgnore]
    public BitmapImage ListPreview { get; set; }

}

私がそのようにシリアライズすること:

private void SaveRecipe()
    {
        fileName = recipeID + ".txt";
        recipe.Title = TitleBox.Text;
        recipe.Ingredients = Ingredients.Text;
        recipe.Instructions = Instructions.Text;

        string tempJPEG = "image" + recipeID + ".jpg";

        IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication();
        using (store = IsolatedStorageFile.GetUserStoreForApplication())
        {
            if (store.FileExists(tempJPEG))
            {
                recipe.ImagePath = tempJPEG;
            }


            using (var file = store.CreateFile(recipe.ID + ".txt"))
            {
                XmlSerializer serializer = new XmlSerializer(typeof(RecipeItem));
                serializer.Serialize(file, recipe);
            }
        }

        store.Dispose();
    }

最後に、ListBox コントロールの List に逆シリアル化します。

       public static List<RecipeItem> CreateTestList()
    {
        List<RecipeItem> list = new List<RecipeItem>();
        RecipeItem recipe = new RecipeItem();

        //Get files from isolated store.
        IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication();
        try
        {
            XmlSerializer serializer = new XmlSerializer(typeof(RecipeItem));
            var filesName = store.GetFileNames();
            if (filesName.Length > 0)
            {
                foreach (string fileName in filesName)
                {
                    if (fileName == "__ApplicationSettings") continue;
                    using (var file = store.OpenFile(fileName, FileMode.Open))
                    {
                        try
                        {
                            recipe = (RecipeItem)serializer.Deserialize(file);
                        }
                        catch
                        {

                        }
                    }

                    using (store = IsolatedStorageFile.GetUserStoreForApplication())
                    {
                        if (recipe.ImagePath!=null)
                        {
                            using (var stream = store.OpenFile(recipe.ImagePath, FileMode.Open, FileAccess.ReadWrite))
                            {
                                recipe.ListPreview.SetSource(stream);
                                recipe.ListPreview.DecodePixelHeight = 100;
                                recipe.ListPreview.DecodePixelWidth = 100;                                
                            }

                        }
                    }
                }
            }
        }
        catch
        {

        }

        list.Add(recipe);
        store.Dispose();
        return list;
    }

コード行で System.AccessViolationException を取得し続けます。

 recipe.ListPreview.SetSource(stream);

基本的にここでやろうとしているのは、ユーザー定義の Image を ListBox にバインドできるようにすることです。BitmapImage はシリアル化できないため、代わりにファイルを IsolatedStorage に保存し、パスを ImagePath という文字列に保存します。ListBox の List を作成するために逆シリアル化するときは、イメージ パスを取得してイメージ ファイルを開き、それを BitmapImage のソースに設定して、ListBox にバインドします。1 行のコード、シリアル化と逆シリアル化の両方が問題なく機能し、IsolatedStorage から直接 Image ファイルを Image コントロールにバインドすることを除いて、私のコードのすべてが正常に機能します。

AccessViolationException の原因は何だと思いますか?

前もって感謝します!

4

2 に答える 2

0

確かではありませんが、UI で IsoStorageStream を直接使用することはできないと思います。MemoryStreamに書き込み、その memoryStream を imageSource に使用してみてください。

//something like this    
using (var store = IsolatedStorageFile.GetUserStoreForApplication())
{
     using (var storeStream = store.OpenFile("file.bin", System.IO.FileMode.Open))
     {
          var memoStream = new System.IO.MemoryStream();
          storeStream.CopyTo(memoStream);
          return memoStream;
     }
}

そうでなければ、なぜあなたがこれを行うのか理解できません:

IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication();
try
{
  using (store = IsolatedStorageFile.GetUserStoreForApplication())
  {...}
}

たぶんバグの別の原因

于 2013-08-28T08:46:35.507 に答える
0

これは正確な解決策ではありませんが、これを機能させる方法を見つけました。新しい BitmapImage を定義し、そのソースを IsolatedStorage からのイメージに設定してから、その BitmapImage をレシピ.ListPreview に等しく設定します。

BitmapImage Test = new BitmapImage();
Test.SetSource(stream);
recipe.ListPreview = Test;    

ご協力いただきありがとうございます!

于 2013-08-28T11:28:56.310 に答える