为什么在持久化的WPF RichTextBox中有自我复制的花括号?

为什么在持久化的WPF RichTextBox中有自我复制的花括号?,wpf,persistence,richtextbox,Wpf,Persistence,Richtextbox,我们的测试人员在我们持久的WPF文本框中抛出了花括号。在保存并重新打开时,会出现更多神奇的花括号 我已经把问题/代码浓缩了下来 <Window x:Class="WpfApplication1.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Window1" Heig

我们的测试人员在我们持久的WPF文本框中抛出了花括号。在保存并重新打开时,会出现更多神奇的花括号

我已经把问题/代码浓缩了下来

<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="*"></RowDefinition>
        <RowDefinition Height="Auto"></RowDefinition>
        <RowDefinition Height="*"></RowDefinition>
    </Grid.RowDefinitions>

    <RichTextBox x:Name="rtb1" />
    <Button Grid.Row="1" Click="Button_Click">Draw a fish</Button>
    <RichTextBox x:Name="rtb2" Grid.Row="2"/>
</Grid>
</Window>

画一条鱼
两个富文本框。单击按钮后,将底部的设置为“持久化”和“还原”后第一个设置的结果

namespace WpfApplication1
{
    /// <summary>
    /// Interaction logic for Window1.xaml
    /// </summary>
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();

            rtb1.Document = new FlowDocument(new Paragraph(new Run("{")));
        }


        public static FlowDocument CreateFlowDocumentFromByteArray(byte[] byteArray)
        {
            return (FlowDocument)XamlReader.Load(new MemoryStream(byteArray));
        }

        public static byte[] CreateByteArrayFromFlowDocument(FlowDocument flowDocument)
        {
            MemoryStream mStream = new MemoryStream();
            XmlWriterSettings settings = new XmlWriterSettings();
            settings.Indent = false;
            settings.OmitXmlDeclaration = true;
            XamlDesignerSerializationManager dsm = new XamlDesignerSerializationManager(XmlWriter.Create(mStream, settings));
            dsm.XamlWriterMode = XamlWriterMode.Value;
            XamlWriter.Save(flowDocument, dsm);
            mStream.Close();
            return mStream.ToArray();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            rtb2.Document = CreateFlowDocumentFromByteArray(CreateByteArrayFromFlowDocument(rtb1.Document));
        }

    }
}
命名空间WpfApplication1
{
/// 
///Window1.xaml的交互逻辑
/// 
公共部分类Window1:Window
{
公共窗口1()
{
初始化组件();
文件=新流程文件(新段落(新运行(“{”));
}
公共静态FlowDocument CreateFlowDocumentFromByteArray(字节[]byteArray)
{
返回(FlowDocument)XamlReader.Load(新内存流(byteArray));
}
公共静态字节[]CreateByteArrayFromFlowDocument(FlowDocument FlowDocument)
{
MemoryStream mStream=新的MemoryStream();
XmlWriterSettings=新的XmlWriterSettings();
settings.Indent=false;
settings.OmitXmlDeclaration=true;
XamlDesignerSerializationManager dsm=新的XamlDesignerSerializationManager(XmlWriter.Create(mStream,settings));
dsm.XamlWriterMode=XamlWriterMode.Value;
XamlWriter.Save(流程文档,dsm);
mStream.Close();
返回mStream.ToArray();
}
私有无效按钮\u单击(对象发送者,路由目标e)
{
rtb2.Document=CreateFlowDocumentFromByteArray(CreateByteArrayFromFlowDocument(rtb1.Document));
}
}
}

为什么会发生这种情况?我们如何阻止它?

今晚我将对代码进行更彻底的测试,但是当大括号不在文本开头时会发生这种情况吗?例如,如果您的跑步是“Hello{World}”,它还会这样做吗

您可能知道,大括号在WPF中很重要,因为它们用于标记扩展。以下标记不起作用:

<Button Content="{Hello}" />

为了获得正确的输出,您通常会使用以下方法来逃避:

<Button Content="{}{Hello}" />


由于您使用的是XamlReader.Load,在XAML中使用{}可能会有一些混淆,因此它们会被转义。但这只是一个猜测。出于兴趣,写出的XAML看起来像什么?

它只在开始时才这样做。当您写出它时,它确实有{}{更准确地说,这只发生在曲括号位于段落开头的情况下。我们有一个解决方法(因为我们已经在树上应用样式了),但它的开销更大,我们对此感到非常沮丧。在我看来,这是一个bug--我在Microsoft Connect上报告过: