Поведение WPF Richtextbox XamlWriter - PullRequest
1 голос
/ 12 апреля 2010

Я пытаюсь сохранить исходный код 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 - это

using System; public class TestCSScript : MarshalByRefObject {}{ } </p> <p>

Обратите внимание на новый набор "{}"

Что я тут не так делаю ... Заранее спасибо за помощь!

1 Ответ

1 голос
/ 13 апреля 2010

Я уже отказался от запоздалого решения, но если кто-то из вас найдет чистое решение, пожалуйста, напишите его.

Я использовал вызов Replace 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

без радости.

...