WPF Richtextbox XamlWriter行为

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

我正试图将一些c#源代码保存到数据库中。基本上,我有一个RichTextBox,用户可以键入他们的代码并将其保存到数据库中

当我从visual studio环境复制和粘贴时,我希望保留格式设置等。因此我选择将FlowDocuments Xaml保存到数据库,并将其设置回RichTextBox.Document

我下面的两个函数是序列化和反序列化RTB的内容

     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独自一人