调用XamlObjectWriter.WriteStartMember触发NullReferenceException求助
解决XamlObjectWriter写入Paragraph.Inlines时的NullReferenceException问题
你的问题出在直接向Paragraph.Inlines集合属性写入字符串值。Inlines是InlineCollection类型的集合,它不能直接接收字符串,必须通过添加Inline派生对象(比如Run)来承载文本内容。此外,XamlObjectWriter处理集合属性时,需要遵循集合内容的写入规范,不能直接对集合成员写原始值。
修正后的代码如下:
using System.Windows.Documents; using System.Xaml; XamlSchemaContext context = System.Windows.Markup.XamlReader.GetWpfSchemaContext()!; using var writer = new XamlObjectWriter(context); // 写入FlowDocument根对象 XamlType flowDocumentXamlType = context.GetXamlType(typeof(FlowDocument))!; writer.WriteStartObject(flowDocumentXamlType); // 写入Blocks集合成员 XamlMember blocksXamlMember = flowDocumentXamlType.GetMember(nameof(FlowDocument.Blocks))!; writer.WriteStartMember(blocksXamlMember); // 写入Paragraph对象 XamlType paragraphXamlType = context.GetXamlType(typeof(Paragraph))!; writer.WriteStartObject(paragraphXamlType); // 写入Inlines集合成员 XamlMember paragraphInlinesXamlMember = paragraphXamlType.GetMember(nameof(Paragraph.Inlines))!; writer.WriteStartMember(paragraphInlinesXamlMember); // 写入Run对象承载文本 XamlType runXamlType = context.GetXamlType(typeof(Run))!; writer.WriteStartObject(runXamlType); XamlMember runTextMember = runXamlType.GetMember(nameof(Run.Text))!; writer.WriteStartMember(runTextMember); writer.WriteValue("Hello, world!"); writer.WriteEndMember(); // 结束Run.Text writer.WriteEndObject(); // 结束Run对象 writer.WriteEndMember(); // 结束Paragraph.Inlines writer.WriteEndObject(); // 结束Paragraph对象 writer.WriteEndMember(); // 结束FlowDocument.Blocks writer.WriteEndObject(); // 结束FlowDocument对象 // 可选:获取生成的FlowDocument实例 FlowDocument doc = writer.Result as FlowDocument;
错误原因解析
当你调用writer.WriteStartMember(paragraphInlinesXamlMember)后直接写字符串值时,XamlObjectWriter会尝试将字符串赋值给Inlines属性,但:
InlineCollection没有公开可设置的setter,只能通过Add方法添加元素;- 字符串不是
Inline类型的实例,无法被集合接受,底层处理时因无法找到合法的赋值逻辑导致空引用异常。
通过添加Run对象作为文本载体,既符合WPF文档模型的结构,也满足XamlObjectWriter对集合属性的写入要求。
内容的提问来源于stack exchange,提问作者Maxence
相关产品推荐
相关产品推荐

