这几天一直有人问我如何保存RichTextBox的文本到数据库,包括格式等等,然后需要的再从数据库取出来,并且显示到RichTextBox中。

其实,RichTextBox的文本是一个FlowDocument类型的对象,我们只需要利用XamlReader和XamlWriter就能很好的完成上述工作。

【保存Document到流】

FlowDocument document = richTextBox.Document;

Stream s = new MemoryStream();  // 其他的什么Stream类型都没问题
XamlWriter.Save(document, s);

// 拿到s之后,再转化成二进制数据写到数据库就OK了

byte[] data = new byte[s.Length];

s.Position = 0;

s.Read(byte, 0, s.Length);

s.Close();

// 拿着data干啥都行

// ……

【从数据库中读取】

// data是从数据库中读出来的二进制数据

Stream s = new MemoryStream(data);

FlowDocument doc = XamlReader.Load(s) as FlowDocument;
s.Close();
richTextBox.Document = doc;

PS:有人问过我如何对RichTextBox的Document属性做绑定,由于RichTextBox的Document属性不是一个DependencyProperty,

所以我采用的是继承RichTextBox,自己定义一个BindableDocument的DependencyProperty来做。

    public class BindableRichTextBox : RichTextBox
    {
        public FlowDocument BindableDocument
        {
            get { return (FlowDocument)GetValue(TextProperty); }
            set { SetValue(TextProperty, value); }
        }

        // Using a DependencyProperty as the backing store for Text.  This enables animation, styling, binding, etc
        public static readonly DependencyProperty TextProperty =
            DependencyProperty.Register("BindableDocument", typeof(FlowDocument), typeof(BindableRichTextBox), new UIPropertyMetadata(null, new PropertyChangedCallback(OnTextPropertyChanged)));

        private static void OnTextPropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
        {
            BindableRichTextBox textBox = sender as BindableRichTextBox;
            if (textBox != null)
            {
                textBox._changeFromBinding = true;
                textBox.OnTextPropertyChanged(e);                
            }
        }

        // 防止死锁,比如A变了通知B,B变了又通知A
        private bool _changeFromBinding = false;

        // 当BindableDocument属性变化时,通知Document属性
        protected virtual void OnTextPropertyChanged(DependencyPropertyChangedEventArgs e)
        {
            if (_changeFromBinding)
            {
                this.Document = e.NewValue as FlowDocument;
            }
        }

        // 当Document属性变化时,通知BindableDocument属性
        protected override void OnTextChanged(TextChangedEventArgs e)
        {
            base.OnTextChanged(e);
            if (!_changeFromBinding)
            {               
                this.BindableDocument = this.Document;
            }
            // 放到外面
            _changeFromBinding = false;
        }
    }

做了个小程序,绑定了一个TextBox的Text到RichTextBox。 下载

转载于:https://www.cnblogs.com/RMay/archive/2008/07/22/1248905.html

【WPF】如何保存RichTextBox的文本到数据库?以及如何对RichTextBox的Document做绑定?...相关推荐

  1. Java的ATM界面任务台选择同时有文本和数据库登陆注册

    < Java项目实训>课程设计报告题目: ATM取款机JAVA实训课程设计 下载点这 运行视频如下: Java的ATM界面任务台选择同时有文本和数据库登陆注册 摘要 我选择的是" ...

  2. Autohotkey全选复制并保存剪切板文本至以时间命名的文本文件

    AutoHotKey实现全选复制并保存剪切板文本至以时间命名的文本文件 一键保存当前页面的文字为文本文件 一键保存当前页面的文字为文本文件 借用AutoHotKey软件编写的一小段代码实现 按组合快捷 ...

  3. spring aop 自定义注解配合swagger注解保存操作日志到mysql数据库含(源码)

    spring aop 自定义注解保存操作日志到mysql数据库 一.思路 二.自定义注解 三.编写操作日志 四.编写操作日志切面\增强 五.使用 六.`注意` 一.思路 利用spring aop 对方 ...

  4. 邮件合并发送html,邮件合并HTML格式文本从数据库到Word文档

    我正在做一个邮件合并使用来自SQL数据库的数据集. ,我取回存储在数据库中有一些HTML标记的数据,例如:邮件合并HTML格式文本从数据库到Word文档 我的一个合并域的包含这样的文字: Bullet ...

  5. java 农历的编写保存数据批量插入到数据库中

    java 农历的编写保存数据批量插入到数据库中 1.阴历转农历的工具类 public class Nongli {private static int monCyl, dayCyl, yearCyl; ...

  6. 数据库的这些性能优化,你做了吗

    转载自   数据库的这些性能优化,你做了吗 在互联网项目中,当业务规模越来越大,数据也越来越多,随之而来的就是数据库压力会越来越大. 我们可能会采取各种方式去优化,比如之前文章提到的缓存方案,SQL优 ...

  7. 数据库MySQL(课下作业,必做)

    数据库MySQL(课下作业,必做) 题目要求: 下载附件中的world.sql.zip, 参考http://www.cnblogs.com/rocedu/p/6371315.html#SECDB,导入 ...

  8. 阿里云数据库专家王颜培:我做MySQL云原生这些年

    三年前,我从淘系业务线转到阿里云数据库团队做MySQL产品.三年过去了,MySQL产品从几十万节点规模发展到百万节点规模,从非云原生的技术架构成功转型到云原生架构.阿里集团是一个巨大的练兵场,一个新的 ...

  9. html保存blob,HTML文本图像并保存为Blob到数据库

    我已将富文本转换为图像并将其保存为数据块. Blob从本地服务器(WINDOWS)创建,但部署到应用程序服务器(LINUX).图像格式(字体,清晰度)发生了变化.我不知道我必须做什么.请说明一下.这是 ...

最新文章

  1. java 组合框_Java知多少(88)列表和组合框
  2. android区块链 钱包_区块链研究实验室|从Android调用区块链智能合约
  3. 如何锁定计算机硬盘,Win7系统怎么锁住磁盘|Win7系统锁住磁盘的详细步骤
  4. sqlserver导出带数据的脚本文件
  5. C#如何生成缩略图、水印
  6. 计算机专业伦理总结,《计算机伦理学》节译实践报告
  7. 如何使能linux vivid
  8. .NET6下周发布真的香,可不少人却只会.NET Framework!
  9. IntelliJ IDEA 2018.2 发布,支持 Java 11
  10. java7和java8切换_仍不切换到Java 8的6个理由
  11. 给Android程序员的一些面试建议,附带学习经验
  12. ie 传递给系统调用的数据区域太小。_RFID银行资产管理系统,智能,简便,易操作...
  13. String、Object、包装类的常用方法以及注意点
  14. 9.UNIX 环境高级编程--进程关系
  15. LIBSVM使用方法及参数设置
  16. flask:小项目(医生与病人)
  17. 【DT调研】关于BIM + GIS的相关知识了解
  18. 前端开发框架、工具汇总清单
  19. APP运营如何实现流量变现,获取更高收益?
  20. 元认知能力---反思能力

热门文章

  1. Magento: 自定义用户登录导向页面 Redirect Customer to Previous Page After Login
  2. WordPress 不用插件实现对长文章进行分页
  3. C/C++——一个因为unsigned引发的大问题
  4. 【latex】最后一页 参考文献不平衡 左右不对齐
  5. Kubernetes—动态存储卷配置(StorageClass资源)(十二)
  6. 【C++基础学习】《C++ Primer》中的“有序型”
  7. TreeView控件的基本使用 界面篇 winform
  8. 演练 小米商城 手机版块 0920
  9. web标准三个要素 此标准的好处
  10. 网页浏览器 市面上存在的网页浏览器