2

目前我正在使用类似的方法

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

这对于保存我的 RichTextBox的内容非常有用。我遇到的麻烦是找到一种方法来保存整个控件。

我尝试使用XmlSerializerwhich 序列化这样的对象时遇到问题,因为存在不可变和接口继承。我得到错误There was an error reflecting type <my window type>。我试过使用 XmlWriter 但运气不佳。

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

4

1 回答 1

1

根据this MSDN Forum Posting,您可以使用命名空间的XamlWriter.Save方法System.Windows.Markup。我修改了 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;
        }
    }
}

测试.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>
于 2012-09-11T04:10:03.187 回答