2

我使用此处的代码(来自 Wiimax 的答案)将我的转换FlowDocumentXML并将其转换回FlowDocument. 但现在我这里有一些问题。

我的转换代码:

public static bool IsFlowDocument(this string xamlString)
        {
            if (xamlString == null || xamlString == "")
                throw new ArgumentNullException();

            if (xamlString.StartsWith("<") && xamlString.EndsWith(">"))
            {
                XmlDocument xml = new XmlDocument();
                try
                {
                    xml.LoadXml(string.Format("<Root>{0}</Root>", xamlString));
                    return true;
                }
                catch (XmlException)
                {
                    return false;
                }
            }
            return false;
        }

        public static FlowDocument toFlowDocument(this string xamlString)
        {
            if (IsFlowDocument(xamlString))
            {
                var stringReader = new StringReader(xamlString);
                var xmlReader = System.Xml.XmlReader.Create(stringReader);

                return XamlReader.Load(xmlReader) as FlowDocument;
            }
            else
            {
                Paragraph myParagraph = new Paragraph();
                myParagraph.Inlines.Add(new Run(xamlString));
                FlowDocument myFlowDocument = new FlowDocument();
                myFlowDocument.Blocks.Add(myParagraph);

                return myFlowDocument;
            }
        }

我输入此代码(例如,它不是我在程序中使用的代码):

我的代码

转换后我得到这个代码:

我的代码

您会看到跳过了一些空白。在命名空间之后添加了一个 { } 我查看了转换后的 XML 字符串,没有跳过空白,但是 { } 是他们的

有人知道如何解决这个问题或看到我的失败吗?

4

1 回答 1

1

大括号:

这是因为 Binding-Syntax 和 WPF(Xamlreader 和 XamlWriter)想要帮助你;)。

当你的 XAML-Code 类似于

<Run Text="{" />

Xaml-Engine 首先假定一个绑定。由于没有并且取决于您创建 FlowDocument 的方式,因此“{”被转义为“{}{”

一种解决方法是,您将大括号放在这样的位置:

<Run>{</Run>

另一种解决方法是避免花括号是第一个字符:

<Run Text=" {" />

空格: 有一个属性可以派上用场:

<Run xml:space="preserve">some                   Space</Run>

这不是 Xaml,而是由 Xaml 引擎处理的 XML 属性。

于 2013-05-15T12:34:30.493 回答