在wpf中RichTextBox式一个富文本控件,在其中我们可以添加图片等内部控件,以及控制段落块的字体等。我们可以采用System.Windows.Markup.XamlWriter.Save(object,stream);来保存,但是例如我们的p_w_picpath(数据源为二进制)内部控件等,这对象无法序列化。这是我们可以采用rtf结构保存和传输,并在另一台机子加载上展现出现。只是rtf数据可能太大,此时我们可以采用ms内置的System.IO.Compression.DeflateStream 压缩压缩后在发送。

关于System.IO.Compression.DeflateStream,msdn上有一句描述如下:

此类表示 Deflate 算法,这是无损压缩和解压缩文件的行业标准算法。 它结合了 LZ77 算法和霍夫曼编码。 只能使用以前绑定的中间存储量来产生或使用数据,即使对于任意长度的、按顺序出现的输入数据流也是如此。 这种格式可以通过不涉及专利使用权的方式轻松实现。 有关更多信息,请参见 RFC 1951。" DEFLATE Compressed Data Format Specification version 1.3(DEFLATE 压缩数据格式规范版本 1.3)。"此类不能用于压缩大于 4 GB 的文件。

此类原本并不提供用来向 .zip 存档中添加文件或从 .zip 存档中提取文件的功能。(原链接)

1:存储和导入rtf的代码:

   
   
   
   
  1. 代码   
  2.  
  3.  public static class RichTextBoxEx  
  4.     {  
  5.         public static string RTF(this RichTextBox richTextBox)  
  6.         {  
  7.             string rtf = string.Empty;  
  8.             TextRange textRange = new TextRange(richTextBox.Document.ContentStart, richTextBox.Document.ContentEnd);  
  9.             using (MemoryStream ms = new MemoryStream())  
  10.             {  
  11.                 textRange.Save(ms, System.Windows.DataFormats.Rtf);  
  12.                 ms.Seek(0, SeekOrigin.Begin);  
  13.                 StreamReader sr = new StreamReader(ms);  
  14.                 rtf = sr.ReadToEnd();  
  15.             }  
  16.  
  17.             return rtf;  
  18.         }  
  19.  
  20.         public static void LoadFromRTF(this RichTextBox richTextBox, string rtf)  
  21.         {  
  22.             if (string.IsNullOrEmpty(rtf))  
  23.             {  
  24.                 throw new ArgumentNullException();  
  25.             }  
  26.             TextRange textRange = new TextRange(richTextBox.Document.ContentStart, richTextBox.Document.ContentEnd);  
  27.             using (MemoryStream ms = new MemoryStream())  
  28.             {  
  29.                 using (StreamWriter sw = new StreamWriter(ms))  
  30.                 {  
  31.                     sw.Write(rtf);  
  32.                     sw.Flush();  
  33.                     ms.Seek(0, SeekOrigin.Begin);  
  34.                     textRange.Load(ms, DataFormats.Rtf);  
  35.                 }  
  36.             }  
  37.         }  
  38.  
  39.     } 

2:压缩的简单封装,转化为二进制,以及二进制转化为Base64String等

   
   
   
   
  1. ::代码   
  2.  
  3. public class StringCompress  
  4.     {  
  5.         public static string Decompress(byte[] bys)  
  6.         {  
  7.             return Decompress(Convert.ToBase64String(bys));  
  8.         }  
  9.         public static string Decompress(string strSource)  
  10.         {  
  11.             return Decompress(strSource, (3 * 1024 * 1024 + 256));//字符串不会超过3M  
  12.         }  
  13.         public static string Decompress(string strSource, int length)  
  14.         {  
  15.             byte[] buffer = Convert.FromBase64String(strSource);  
  16.  
  17.             System.IO.MemoryStream ms = new System.IO.MemoryStream();  
  18.             ms.Write(buffer, 0, buffer.Length);  
  19.             ms.Position = 0;  
  20.             System.IO.Compression.DeflateStream stream = new System.IO.Compression.DeflateStream(ms, System.IO.Compression.CompressionMode.Decompress);  
  21.             stream.Flush();  
  22.  
  23.             int nSize = length;  
  24.             byte[] decompressBuffer = new byte[nSize];  
  25.             int nSizeIncept = stream.Read(decompressBuffer, 0, nSize);  
  26.             stream.Close();  
  27.  
  28.             return System.Text.Encoding.Unicode.GetString(decompressBuffer, 0, nSizeIncept);//转换为普通的字符串  
  29.         }  
  30.  
  31.  
  32.         public static byte[] Compress(string strSource)  
  33.         {  
  34.             if (strSource == null)  
  35.                 throw new System.ArgumentException("字符串为空!");  
  36.  
  37.             System.Text.Encoding encoding = System.Text.Encoding.Unicode;  
  38.             byte[] buffer = encoding.GetBytes(strSource);  
  39.  
  40.             System.IO.MemoryStream ms = new System.IO.MemoryStream();  
  41.             System.IO.Compression.DeflateStream stream = new System.IO.Compression.DeflateStream(ms, System.IO.Compression.CompressionMode.Compress, true);  
  42.             stream.Write(buffer, 0, buffer.Length);  
  43.             stream.Close();  
  44.  
  45.             buffer = ms.ToArray();  
  46.             ms.Close();  
  47.  
  48.             return buffer;  
  49.             // return Convert.ToBase64String(buffer); //将压缩后的byte[]转换为Base64String  
  50.         }  
  51.  
  52.     }  
  53.  
  54.  
  55. 复制代码  
  56.