如何反序列化和加载序列化的 XAML UI 元素?

Posted

技术标签:

【中文标题】如何反序列化和加载序列化的 XAML UI 元素?【英文标题】:How can I deserialize and load serialized XAML UI Elements? 【发布时间】:2020-10-29 02:28:27 【问题描述】:

我的应用程序有一项功能,它涉及保存一些已创建的 UI 元素,以便在用户下次启动应用程序时重新创建它们。

为此,它使用 XamlWriter.Save 函数保存 UI 元素对象,然后将该字符串保存到 XML 文件中。我可以成功找回它保存的字符串。

例如,这是一个被序列化并保存的按钮:

<Button Name="Thumb1" Grid.Column="0" Grid.Row="0" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:swi="clr-namespace:System.Windows.Interop;assembly=PresentationCore" xmlns:s="clr-namespace:System;assembly=mscorlib"><Button.Tag><s:Int32>0</s:Int32></Button.Tag><Image Stretch="UniformToFill" Width="380" Height="213" HorizontalAlignment="Center" VerticalAlignment="Center"><Image.Source><swi:InteropBitmap /></Image.Source></Image></Button>

但是,当我尝试使用以下代码重新加载此数据时,我收到 XamlParseException,它表示“根级别的数据无效。第 1 行,位置 1。”

using (StringReader SR = new StringReader(Attribute) )

    using (XmlReader XR = XmlReader.Create(SR) )
    
        InMedButton = (System.Windows.Controls.Button)XamlReader.Load(XR);
    
;

这是我从 Microsoft 文档获得的代码 sn-p:https://docs.microsoft.com/en-us/dotnet/api/system.windows.markup.xamlwriter?view=netcore-3.1

我觉得它可能没有正确序列化 XAML,因为它没有像 XML 或 XAML 通常那样以树状结构格式化,但我不知道。

如何正确反序列化和加载 XAML?

【问题讨论】:

你必须按照你写数据的相反顺序阅读。写代码和读代码不一致。 您应该首先将您的 ui 创建为字符串,然后 xamlreader.parse 将其转换为 ui。然后,您可以将字符串保存到磁盘上的文件中。 Xamlwriter 保存有一些严重的限制。 @jdweng 不幸的是,反转字符串并没有解决它。我确实看到了 w/r 代码之间的区别。当写入 XML 时,像 > 或 " 之类的某些字符的编码方式不同。我想修复的函数可能会起作用 @Andy 如何将其设为字符串? 我没有说反转字符串。 【参考方案1】:

正如 jdweng 让我意识到的那样,XML 以不同的方式格式化某些字符。在我的情况下,''、'&' 和 '"' 都被替换为 XML 中的特定字符代码,我认为这是序列化程序的错误。制作一个函数来用它们各自的字符替换这些代码修复了它.

【讨论】:

以上是关于如何反序列化和加载序列化的 XAML UI 元素?的主要内容,如果未能解决你的问题,请参考以下文章

如何在c#中使用具有相同名称但不同属性和结构的元素反序列化XML

如何反序列化具有可序列化对象数组的类

如何反序列化 C# 中只有属性的 xml 元素?

如何反序列化列表以获取元素值

如何在 .NET 中反序列化为本地集合?

如何在给定元素后反序列化 XML 并获取特定键的值