3

我们的测试人员在我们持久化的 WPF RichTextBoxes 上加上了大括号。在保存并重新打开时,神奇地有更多的大括号。

我已经浓缩了问题/代码。

<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));
        }

    }
}

为什么会这样?我们如何阻止它?

4

1 回答 1

1

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

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

<Button Content="{Hello}" />

要获得正确的输出,您通常会使用以下命令对其进行转义:

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

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

于 2009-02-25T04:04:07.247 回答