WPF Richtextbox XamlWriter行为
我正试图将一些c#源代码保存到数据库中。基本上,我有一个RichTextBox,用户可以键入他们的代码并将其保存到数据库中 当我从visual studio环境复制和粘贴时,我希望保留格式设置等。因此我选择将FlowDocuments Xaml保存到数据库,并将其设置回RichTextBox.Document 我下面的两个函数是序列化和反序列化RTB的内容WPF Richtextbox XamlWriter行为,wpf,xaml,richtextbox,xamlreader,Wpf,Xaml,Richtextbox,Xamlreader,我正试图将一些c#源代码保存到数据库中。基本上,我有一个RichTextBox,用户可以键入他们的代码并将其保存到数据库中 当我从visual studio环境复制和粘贴时,我希望保留格式设置等。因此我选择将FlowDocuments Xaml保存到数据库,并将其设置回RichTextBox.Document 我下面的两个函数是序列化和反序列化RTB的内容 private string GetXaml(FlowDocument document) { if (d
private string GetXaml(FlowDocument document)
{
if (document == null) return String.Empty;
else{
StringBuilder sb = new StringBuilder();
XmlWriter xw = XmlWriter.Create(sb);
XamlDesignerSerializationManager sm = new XamlDesignerSerializationManager(xw);
sm.XamlWriterMode = XamlWriterMode.Expression;
XamlWriter.Save(document, sm );
return sb.ToString();
}
}
private FlowDocument GetFlowDocument(string xamlText)
{
var flowDocument = new FlowDocument();
if (xamlText != null) flowDocument = (FlowDocument)XamlReader.Parse(xamlText);
// Set return value
return flowDocument;
}
然而,当我尝试序列化和反序列化以下代码时,我注意到了这种不正确的(?)行为
using System;
public class TestCSScript : MarshalByRefObject
{
}
序列化XAML是
使用
制度;
公众的
类TestCSScript:
MarshallByRefObject
{}{
}
请注意新的“{}”集合
我在这里做错了什么。。。提前感谢您的帮助 我现在已经接受了一个姗姗来迟的解决方案,但如果你们中有人找到了一个干净的,请发布它 我使用了Stringbuilder的替换调用来删除不需要的字符
private string GetXaml(FlowDocument document)
{
if (document == null) return String.Empty;
else
{
StringBuilder sb = new StringBuilder();
using (XmlWriter xw = XmlWriter.Create(sb))
{
XamlDesignerSerializationManager sm = new XamlDesignerSerializationManager(xw);
sm.XamlWriterMode = XamlWriterMode.Expression;
XamlWriter.Save(document, sm);
}
sb.Replace("{}", "");
return sb.ToString();
}
}
我有一种感觉,当xamlwriter遇到“{”字符时,它会将其作为绑定表达式来勇敢地表示。我想知道这个字符的转义序列是什么
注意-我试着改变
XamlWriterMode from XamlWriterMode.Expression to XamlWriterMode.Value
毫无乐趣。我暂时接受了一个姗姗来迟的解决方案,但如果你们中有人找到了一个干净的,请发布它 我使用了Stringbuilder的替换调用来删除不需要的字符
private string GetXaml(FlowDocument document)
{
if (document == null) return String.Empty;
else
{
StringBuilder sb = new StringBuilder();
using (XmlWriter xw = XmlWriter.Create(sb))
{
XamlDesignerSerializationManager sm = new XamlDesignerSerializationManager(xw);
sm.XamlWriterMode = XamlWriterMode.Expression;
XamlWriter.Save(document, sm);
}
sb.Replace("{}", "");
return sb.ToString();
}
}
我有一种感觉,当xamlwriter遇到“{”字符时,它会将其作为绑定表达式来勇敢地表示。我想知道这个字符的转义序列是什么
注意-我试着改变
XamlWriterMode from XamlWriterMode.Expression to XamlWriterMode.Value
毫无乐趣。{}是一个很好的例子,所以你所看到的是完全正确的。真正的问题是:为什么这会困扰你?你的意图是(反)序列化一个流文档到/从XAML,这显然对你有用。那么为什么要对{}大惊小怪呢?您不应尝试解释序列化内容。我尝试序列化的内容是C#code。当我将序列化内容重新加载回richtext框时,新的{}集将使我的代码不可编译。任何序列化的下一次迭代将为遇到的每个{添加一组新的{}。请注意(FlowDocument)Parse(XamlReader.Parse);并没有删除这些字符。我理解序列化位,但在反序列化时,读取器是否应该删除转义序列{}是一个问题,因此您看到的是完全有效的。真正的问题是:这为什么会困扰您?您的意图是(de)将FlowDocument序列化到XAML中/从XAML中序列化,这显然对您有效。那么为什么要对{}大惊小怪呢?您不应该尝试解释序列化的内容。我尝试序列化的内容是C#代码。当我将序列化的内容重新加载回richtext框时,新的{}集将使我的代码不可编译。任何序列化的下一次迭代将为遇到的每个{添加一组新的{}。请注意(FlowDocument)XamlReader.Parse(xamlText);没有删除这些字符。我理解序列化位,但在反序列化时-如果读者不删除转义序列,我会觉得这是一个错误--我在Microsoft Connect上报告过:谢谢-很高兴知道我不是孤独的看起来是个错误--我在Microsoft Connect上报告过:谢谢-很高兴知道我不是t独自一人