0

一部のテキストのコンテンツを XML ファイルにシリアライズしようとしています (ユーザーが選択内容を保存するときに実行されます)。後でそれをデシリアライズします (ユーザーが保存した選択内容を表示することを選択したとき)。

シリアル化に関する次のチュートリアルに従っています。

また、LINQ to XML 経由でこれを実行しようとしましたが、名前空間エラーが発生したか、ツールがエラーを返さなかったが機能しませんでした (以下で説明するのと同じ問題で)。

私が抱えている問題は、コードがエラーを返さないことですが、関数が機能していないことです (「キャッチ」が返されていることを確認できるラベル コントロールがあります)。C# を使用して、Expression Blend でツールを構築しています。

これが私のSaveSelection.csクラスです

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Xml.Serialization;
using System.Xml;

namespace DYH
{
public class SaveSelections
{
    [XmlAttribute("Title")]
    public string Title
    { get; set; }

    [XmlElement("Roof")]
    public string RoofSelection
    { get; set; }

    [XmlElement("Cladding")]
    public string CladdingSelection
    { get; set; }

    [XmlElement("MixedCladding")]
    public string MixedCladdingSelection
    { get; set; }

    [XmlElement("FAJ")]
    public string FAJSelection
    { get; set; }

    [XmlElement("GarageDoor")]
    public string GarageDoorSelection
    { get; set; }

    [XmlElement("FrontDoor")]
    public string FrontDoorSelection
    { get; set; }
}
}

ここに私のC#コードがあります

// Save Selection Button
        private void Button_SaveSelection_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
        {   
            try
            {
                // Save selections into the SavedSelections.xml doc
                SaveSelections userselection = new SaveSelections();
                userselection.Title = TextBox_SaveSelection.Text;
                userselection.RoofSelection = Button_Roof_Select.Text;
                userselection.CladdingSelection = Button_Cladding_Select.Text;
                userselection.MixedCladdingSelection = Button_MixedCladding_Select.Text;
                userselection.FAJSelection = Button_FAJ_Select.Text;
                userselection.GarageDoorSelection = Button_GarageDoor_Select.Text;
                userselection.FrontDoorSelection = Button_FrontDoor_Select.Text;

                SerializeToXML(userselection);

//              XDocument xmlSaveSelections = XDocument.Load("../SavedSelections.xml");
//          
//              XElement newSelection = new XElement("Selection", //xmlSaveSelections.Element("Selections").Add(
//                      //new XElement("Selection",
//                      new XElement("Title", TextBox_SaveSelection.Text),
//                      new XElement("RoofSelection", Button_Roof_Select.Text),
//                      new XElement("CladdingSelection", Button_Cladding_Select.Text),
//                      new XElement("MixedCladdingSelection", Button_MixedCladding_Select.Text),
//                      new XElement("FAJSelection", Button_FAJ_Select.Text),
//                      new XElement("GarageDoorSelection", Button_GarageDoor_Select.Text),
//                      new XElement("FrontDoorSelection", Button_FrontDoor_Select.Text));
//              
////                xmlSaveSelections.Add(newSelection);
////                xmlSaveSelections.Save("../SavedSelections.xml");

                SelectionLabel.Text = "Your selection has been saved as " + "'" + TextBox_SaveSelection.Text + "'. We suggest you write down the name of your selection.";
            }
            catch(Exception ex)
            {
                            throw ex;
                SelectionLabel.Text = "There was a problem saving your selection. Please try again shortly.";
            }
        }

        // Saves SaveSelection.cs to XML file SavedSelections.xml
        static public void SerializeToXML(SaveSelections selection)
        {
            XmlSerializer serializer = new XmlSerializer(typeof(SaveSelections));
            TextWriter textWriter = new StreamWriter(@"/SavedSelections.xml");
            serializer.Serialize(textWriter, selection);
            textWriter.Close();
        }

私が試した以前の形式を確認できるように、以前の試みの 1 つをコメントアウトして残しました。

私の問題は、ツールを使用しようとすると、SelectionLabel.Text が「選択内容の保存中に問題が発生しました。しばらくしてからもう一度お試しください」を返すことです。そのため、コードがキャッチを返し、「try」を実行していないことがわかります。

何か助けて??

2012 年 6 月 18 日編集:以下のコードは、質問に対する正解として機能するコードです。

public void Button_SaveSelection_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
    {
        string roofSelection = TextBox_SaveSelection.Text + "_RoofSelection";
        string claddingSelection = TextBox_SaveSelection.Text + "_CladdingSelection";
        string mixedCladdingSelection = TextBox_SaveSelection.Text + "_MixedCladdingSelection";
        string fajSelection = TextBox_SaveSelection.Text + "_FAJSelection";
        string garageDoorSelection = TextBox_SaveSelection.Text + "_GarageDoorSelection";
        string frontDoorSelection = TextBox_SaveSelection.Text + "_FrontDoorSelection";

        try
        {
            using (var store = IsolatedStorageFile.GetUserStoreForApplication())
            {
                // Gives us 6Mb of storage space in IsoStore
                Int64 isoSpaceNeeded = 1048576 * 6;
                Int64 currentIsoSpace = store.AvailableFreeSpace;

                // If space needed is greater than (>) space available, increase space
                if (isoSpaceNeeded > currentIsoSpace)
                {
                    // If user accepts space increase
                    if (store.IncreaseQuotaTo(currentIsoSpace + isoSpaceNeeded))
                    {
                        IsolatedStorageFileStream file = store.CreateFile("SavedSelections.txt");
                        file.Close();

                        // Stream writer to populate information in
                        using (StreamWriter sw = new StreamWriter(store.OpenFile("SavedSelections.txt", FileMode.Open, FileAccess.Write)))
                        {
                            appSettings.Add(roofSelection, Button_Roof_Select.Text);
                            sw.WriteLine(roofSelection);
                            appSettings.Add(claddingSelection, Button_Cladding_Select.Text);
                            sw.WriteLine(claddingSelection);
                            appSettings.Add(mixedCladdingSelection, Button_MixedCladding_Select.Text);
                            sw.WriteLine(mixedCladdingSelection);
                            appSettings.Add(fajSelection, Button_FAJ_Select.Text);
                            sw.WriteLine(fajSelection);
                            appSettings.Add(garageDoorSelection, Button_GarageDoor_Select.Text);
                            sw.WriteLine(garageDoorSelection);
                            appSettings.Add(frontDoorSelection, Button_FrontDoor_Select.Text);
                            sw.WriteLine(frontDoorSelection);
                        }

                        SelectionLabel.Text = "Your selection has been saved as " + "'" + TextBox_SaveSelection.Text + "'. We suggest you write down the name of your selection.";
                    }
                }
            }

            SelectionLabel.Text = "Your selection has been saved as " + "'" + TextBox_SaveSelection.Text + "'. We suggest you write down the name of your selection.";
        }
        catch //(Exception ex)
        {
            //throw ex;
            SelectionLabel.Text = "There was a problem saving your selection. Please try again shortly.";
        }
    }
4

1 に答える 1

0

ファイルにアクセスしようとしているために問題が発生しているようですが、そのファイルはユーザー アクションによって開始された FileSaveDialog からのものではありませんでした。ローカル ファイル システムへのアクセスが許可されていない Silverlight のセキュリティ機能に遭遇しています。代わりに、IsolatedStorage への書き込みを試してください。ただし、エンド ユーザーはアプリケーション ストレージを完全に (選択的にも) 無効にできるため、これらの例外も処理する必要があることに注意してください。

これは、IsolatedStorage の使用方法に関する簡単な記事です。

于 2012-06-13T17:55:52.980 に答える