序列化RichTextBox包括大小,背景颜色,位置

时间:2012-09-10 23:33:48

标签: c# wpf xaml xml-serialization

目前我正在使用像

这样的方法
    var content = new TextRange(myRichtextBox.NoteBody.Document.ContentStart, myRichtextBox.NoteBody.Document.ContentEnd);
    using (FileStream fs = File.Create(SavePath))
    {
        content.Save(fs, DataFormats.XamlPackage);
    }

保存RichTextBox的内容非常有用。我遇到的问题是找到一种方法来保存整个控件。

我尝试使用XmlSerializer,因为存在不可变和接口继承,因此无法序列化这样的对象。我收到错误There was an error reflecting type <my window type>。我尝试过使用XmlWriter,但运气不好。

我正在考虑创建第二个XML文件,该文件保存了对我很重要的RTB的一些关键属性,以及对RTB内容的XAML序列化的引用。但是在我完成从头开始创建XML文档的所有努力之前,我想要避免使用不可序列化的元素:是否有更多选项?如何保存RichTextBox的状态?

1 个答案:

答案 0 :(得分:1)

根据此MSDN Forum Posting,您可以使用System.Windows.Markup命名空间的XamlWriter.Save方法。我修改了RichtextBox的给定示例并进行了测试。

从MSDN链接定义XamlWriter类:

  

提供单个静态Save方法(多个重载),可用于将提供的运行时对象的有限XAML序列化为XAML标记。

<强>的Xaml

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
    <Grid>
        <RichTextBox Height="100" HorizontalAlignment="Left" Margin="10,10,0,0" Name="richTextBox1" VerticalAlignment="Top" Width="200" Background="#FF00F7F7">
            <FlowDocument>
                <Paragraph>
                    <Run Text="Hello World"/>
                </Paragraph>
            </FlowDocument>
        </RichTextBox>
        <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="92,164,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" />
        <Label Content="Label" Height="221" HorizontalAlignment="Left" Margin="216,12,0,0" Name="label1" VerticalAlignment="Top" Width="250" />
    </Grid>
</Window>

<强> Xaml.cs

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Markup;
using System.IO;
using System.Xml;


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

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            string savedRichTextBox = XamlWriter.Save(richTextBox1);
            File.WriteAllText(@"C:\Temp\Test.xaml", savedRichTextBox);

            StringReader stringReader = new StringReader(savedRichTextBox);
            XmlReader xmlReader = XmlReader.Create(stringReader);

            RichTextBox rtbLoad = (RichTextBox)XamlReader.Load(xmlReader);

            label1.Content = rtbLoad;
        }
    }
}

<强> Test.xaml

<RichTextBox Background="#FF00F7F7" Name="richTextBox1" Width="200" Height="100" Margin="228,173,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"><FlowDocument PagePadding="5,0,5,0" AllowDrop="True"><Paragraph>Hello World</Paragraph></FlowDocument></RichTextBox>