目前我正在使用像
这样的方法 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的状态?
答案 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>