【问题标题】:xml Parse Exception error when deserializing WPF反序列化 WPF 时出现 xml Parse Exception 错误
【发布时间】:2013-07-29 08:34:29
【问题描述】:

我在反序列化 xaml 文件时遇到问题并收到以下错误

我的代码如下:

    private void SerializeToXML()
    {
        FileStream filestream = File.Create(@"H:\test1.xaml");
        StreamWriter streamwriter = new StreamWriter(filestream);

        foreach (ListViewItem Item in slideListView.Items)
        {
            string mystrXAMLWrite = XamlWriter.Save(Item.Tag);
            streamwriter.Write(mystrXAMLWrite);
        }

        streamwriter.Close();
        filestream.Close();

    }

    private void DeSerialize()
    {
        FileStream filestream = File.Open(@"H:\test1.xaml", FileMode.Open);

        XamlReader reader = new XamlReader();

        slideListView = (ListView)reader.LoadAsync(filestream);

    }

如果我在保存后转到 XAML 文件并更改它有问题的各种名称,例如将 slideCanvas 更改为 slideCanvas1 并将 ContextMenu 更改为 ContextMenu1,那么它将加载。但显然这不是一个解决方案,这也意味着重新加载的任何内容都没有指向正确的代码位,因为它们已将数字添加到值中。

有人知道我需要在这里做什么吗?

更新

这是保存一个幻灯片对象时生成的xaml

<Slide imageZIndex="0" editText="False" ClipToBounds="True" xmlns="clr-namespace:StoryboardTool;assembly=StoryboardTool" xmlns:av="http://schemas.microsoft.com/winfx/2006/xaml/presentation"><av:Canvas Background="#FFFFFFFF" Name="slideCanvas" /></Slide>

例如,如果我尝试将其放置在幻灯片对象中

Var obj = (Slide)reader.LoadAsync(filestream);

我遇到了这个 XmalParseExceptionOccured 问题。

【问题讨论】:

    标签: c# wpf serialization xamlparseexception


    【解决方案1】:

    错误提示无法在此范围内注册重复名称“slideCanvas”。我只能假设您在某个应用程序中定义了另一个名为“slideCanvas”的控件。您是否尝试过搜索“slideCanvas”的整个解决方案?

    除此之外,还有一些其他问题会导致此异常:

    1. Resources 部分中使用x:Name 而不是x:Key 声明控件。
    2. 试图序列化包含代码的控件。

    您也可以尝试简单地从控件中删除名称并绑定到它们以复制您为其命名的任何功能。

    如果仍有问题,请在尝试反序列化时显示导致错误的 XAML。

    【讨论】:

    • 我正在尝试序列化包含代码的控件。有办法解决吗?
    • XamlReader 是解析器,而不是编译器,所以不,您不能使用 XamlReader 编译代码。我不知道你的代码后面有什么代码,但如果它很简单,你可以删除它并在加载 XAML 后重新添加它。例如,为 slideListView 加载 XAML,然后此时将新的事件处理程序添加到此 ListView 对象。
    • 嗨,Sheridan,我已经用我尝试加载的最简单的 xaml 更新了我的问题,你知道为什么 xaml 会出现这个错误。是不是因为我的幻灯片对象附加了事件处理程序等?
    【解决方案2】:

    我是如何解决这个问题的: 1. 使继承自您的控件的用户控件 2.在构造函数中添加this

    static int counter = 0;
    public TestControl()
    {
        InitializeComponent();
        this.Name += counter.ToString();
        counter ++;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-07
      • 1970-01-01
      • 2011-06-15
      • 1970-01-01
      • 1970-01-01
      • 2014-03-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多