首页 > 解决方案 > C# 如何使用 XML 加载 Canvas

问题描述

我的问题是我不知道如何从 XML 文件中加载 Canvas 类型的对象。我希望你能帮助我。

这就是我正在尝试的,我也会向您展示我如何进行序列化的代码,以防万一我做错了什么。

private void SaveButton_Click(object sender, RoutedEventArgs e)
{

    SaveFileDialog sfd = new SaveFileDialog();

    sfd.FileName = "untitled";
    sfd.Filter = "XML Files(*.xml) | *.xml | Text Files(*.txt) | *.txt | All Files(*.*) | *.*  ";

    sfd.ShowDialog();

    MainWindow mainWindow = new MainWindow();

    SerializeToXML(mainWindow, designSpace, 96, sfd.FileName);

      mainWindow.Close();


}

public static void SerializeToXML(MainWindow window, Canvas canvas, int dpi, string filename)
{

    string mystrXAML = XamlWriter.Save(canvas);

    FileStream filestream = File.Create(filename);
    StreamWriter streamwriter = new StreamWriter(filestream);
    streamwriter.Write(mystrXAML);
    streamwriter.Close();
    filestream.Close();
}





private void LoadButton_Click(object sender, RoutedEventArgs e)
{
    var fileContent = string.Empty;
    OpenFileDialog ofd = new OpenFileDialog();
    ofd.InitialDirectory = "c:\\";
    ofd.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*";
    ofd.FilterIndex = 2;
    ofd.RestoreDirectory = true;

     ofd.ShowDialog();


    var fileStream = ofd.OpenFile();
    string boi = ofd.FileName;

    // Create an instance of the XmlSerializer specifying type.
    XmlSerializer serializer =
    new XmlSerializer(typeof(Canvas));

    // Create a TextReader to read the file. 
    FileStream fs = new FileStream(boi, FileMode.Open);
    TextReader reader = new StreamReader(fs);

    // Use the Deserialize method to restore the object's state.
    designSpace = (Canvas)serializer.Deserialize(reader);



}

在我尝试加载 XML 文件之前,该应用程序运行良好,这时会弹出此异常:

System.InvalidOperationException: 'Error to reflect type System.Windows.Controls.Canvas'.'

NotSupportedException: Can not serialize the member
System.Windows.Input.InputBinding.Command type
System.Windows.Input.ICommand because it's an interface.

标签: c#xmlwpfcanvasxml-deserialization

解决方案


我做了

在储蓄:

string xml = XamlWriter.Save(cssave);
using (StreamWriter fl = new StreamWriter(path, false))
{
    fl.Write(xml);
}

在加载中:

string xml = File.ReadAllText(currpath);
//Convert string to stream
byte[] byteArray = Encoding.UTF8.GetBytes(xml);
MemoryStream stream = new MemoryStream(byteArray);
Canvas cs = (Canvas)XamlReader.Load(stream);
csmain.Children.Add(cs);

推荐阅读