WPF RichTextBox转化为rtf格式,以及加载,压缩

简介:

  在wpf中RichTextBox式一个富文本控件,在其中我们可以添加图片等内部控件,以及控制段落块的字体等。我们可以采用System.Windows.Markup.XamlWriter.Save(object,stream);来保存,但是例如我们的image(数据源为二进制)内部控件等,这对象无法序列化。这是我们可以采用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的代码:

复制代码
ExpandedBlockStart.gif 代码
  public   static   class  RichTextBoxEx
    {
        
public   static   string  RTF( this  RichTextBox richTextBox)
        {
            
string  rtf  =   string .Empty;
            TextRange textRange 
=   new  TextRange(richTextBox.Document.ContentStart, richTextBox.Document.ContentEnd);
            
using  (MemoryStream ms  =   new  MemoryStream())
            {
                textRange.Save(ms, System.Windows.DataFormats.Rtf);
                ms.Seek(
0 , SeekOrigin.Begin);
                StreamReader sr 
=   new  StreamReader(ms);
                rtf 
=  sr.ReadToEnd();
            }

            
return  rtf;
        }

        
public   static   void  LoadFromRTF( this  RichTextBox richTextBox,  string  rtf)
        {
            
if  ( string .IsNullOrEmpty(rtf))
            {
                
throw   new  ArgumentNullException();
            }
            TextRange textRange 
=   new  TextRange(richTextBox.Document.ContentStart, richTextBox.Document.ContentEnd);
            
using  (MemoryStream ms  =   new  MemoryStream())
            {
                
using  (StreamWriter sw  =   new  StreamWriter(ms))
                {
                    sw.Write(rtf);
                    sw.Flush();
                    ms.Seek(
0 , SeekOrigin.Begin);
                    textRange.Load(ms, DataFormats.Rtf);
                }
            }
        }

    }
复制代码

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

复制代码
ExpandedBlockStart.gif 代码
public   class  StringCompress
    {
        
public   static   string  Decompress( byte [] bys)
        {
            
return  Decompress(Convert.ToBase64String(bys));
        }
        
public   static   string  Decompress( string  strSource)
        {
            
return  Decompress(strSource, ( 3   *   1024   *   1024   +   256 )); // 字符串不会超过3M
        }
        
public   static   string  Decompress( string  strSource,  int  length)
        {
            
byte [] buffer  =  Convert.FromBase64String(strSource);

            System.IO.MemoryStream ms 
=   new  System.IO.MemoryStream();
            ms.Write(buffer, 
0 , buffer.Length);
            ms.Position 
=   0 ;
            System.IO.Compression.DeflateStream stream 
=   new  System.IO.Compression.DeflateStream(ms, System.IO.Compression.CompressionMode.Decompress);
            stream.Flush();

            
int  nSize  =  length;
            
byte [] decompressBuffer  =   new   byte [nSize];
            
int  nSizeIncept  =  stream.Read(decompressBuffer,  0 , nSize);
            stream.Close();

            
return  System.Text.Encoding.Unicode.GetString(decompressBuffer,  0 , nSizeIncept); // 转换为普通的字符串
        }


        
public   static   byte [] Compress( string  strSource)
        {
            
if  (strSource  ==   null )
                
throw   new  System.ArgumentException( " 字符串为空! " );

            System.Text.Encoding encoding 
=  System.Text.Encoding.Unicode;
            
byte [] buffer  =  encoding.GetBytes(strSource);

            System.IO.MemoryStream ms 
=   new  System.IO.MemoryStream();
            System.IO.Compression.DeflateStream stream 
=   new  System.IO.Compression.DeflateStream(ms, System.IO.Compression.CompressionMode.Compress,  true );
            stream.Write(buffer, 
0 , buffer.Length);
            stream.Close();

            buffer 
=  ms.ToArray();
            ms.Close();

            
return  buffer;
            
//  return Convert.ToBase64String(buffer);  // 将压缩后的byte[]转换为Base64String
        }

    }

复制代码

 

本文转自破狼博客园博客,原文链接:http://www.cnblogs.com/whitewolf/archive/2011/01/09/1931290.html,如需转载请自行联系原作者


目录
相关文章
|
C# 前端开发
WPF加载等待动画
原文:WPF加载等待动画 原文地址:https://www.codeproject.com/Articles/57984/WPF-Loading-Wait-Adorner 界面遮罩 等待动画全局颜色 ...
3332 0
WPF从外部文件或者程序集加载样式或其他静态资源
WPF从外部文件或者程序集加载样式或其他静态资源
WPF从外部文件或者程序集加载样式或其他静态资源
|
大数据 C# 数据库
WPF DataGrid 性能加载大数据
原文:WPF DataGrid 性能加载大数据 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010265681/article/details/76651725  WPF(Windows Presentation Foundation)应用程序在没有图形加速设备的机器上运行速度很慢是个公开的秘密,给用户的感觉是它太吃资源了,WPF程序的性能和硬件确实有很大的关系,越高档的机器性能越有优势。
2111 0
|
C#
关于WPF的ComboBox中Items太多而导致加载过慢的问题
原文:关于WPF的ComboBox中Items太多而导致加载过慢的问题                                     【WFP疑难】关于WPF的ComboBox中Items太多而导致加载过慢的问题                                      ...
1292 0
|
C# UED
WPF中加载高分辨率图片性能优化
原文:WPF中加载高分辨率图片性能优化 在最近的项目中,遇到一个关于WPF中同时加载多张图片时,内存占用非常高的问题。 问题背景: 在一个ListView中同时加载多张图片,注意:我们需要加载的图片分辨率非常高。
1437 0
|
C#
WPF加载程序集中字符串资源
原文:WPF加载程序集中字符串资源   WPF资源 WPF资源使用其实的也是resources格式嵌入资源,默认的资源名称为"应用程序名.g.resources",不过WPF资源使用的pack URI来访问资源。
966 0
|
C#
WPF中,怎样将XAML代码加载为相应的对象?
原文:WPF中,怎样将XAML代码加载为相应的对象? 在前面“在WPF中,如何得到任何Object对象的XAML代码?”一文中,我介绍了使用System.Windows.Markup.XamlWriter.Save(objName)得到任何Object对象的XAML代码。
891 0
|
C# 前端开发 Android开发
WPF 客户端浏览器 添加Loading加载进度
原文:WPF 客户端浏览器 添加Loading加载进度 在windows开发界面时,使用浏览器来请求和显示网页内容,是比较常见的。 但是在请求网页内容时,因网速或者前端功能复杂加载较慢,亦或者加载时遇到各种问题,如空白/黑屏/加载不完整/证书问题等。
1650 0
|
C#
WPF loading加载动画库
原文:WPF loading加载动画库 1. 下载Dll        https://pan.baidu.com/s/1wKgv5_Q8phWo5CrXWlB9dA 2.
2232 0
|
C#
WPF 仪表盘 刻度盘 动态 加载中 开源
原文:WPF 仪表盘 刻度盘 动态 加载中 开源  1. 表盘   参数可以设置, codeproject上写的。网址在这里。 源码里有demo,很详细。 源码在这里。 2. 动态Loading  截图效果跟实际有点不一样。
1626 0