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>

2 つのリッチ テキスト ボックス。ボタンをクリックすると、永続化して復元した後、一番下のものが最初の結果に設定されます。

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 に答える