RichTextBox FlowDocument类型操作

    最近研究微信项目,套着web版微信协议做了一个客户端,整体WPF项目MVVM架构及基本代码参考于:http://www.cnblogs.com/ZXdeveloper/archive/2016/11/13/6058206.html

由于参考博主的项目没有实现RichTextBox绑定图片与后台接收图片的处理,自己找了一些方法做了一些处理,记录下以防后期用到,或者有人也碰到这个问题提供一些参考。

RichTextBox具体值绑定于FlowDocument类型,详细介绍可以查询微软的官方介绍。

下面正文获取RichTextBox中的图片或者文字以及QQ表情

/// <summary>
        /// 将Document里的值转换成图片或者文字
        /// </summary>
        /// <param name="fld"></param>
        /// <returns></returns>
        public void FlowDocumentMessage(FlowDocument fld)
        {
            if (fld != null)
            {
                string resutStr = string.Empty;
                foreach (var root in fld.Blocks)
                {
                    if (root is BlockUIContainer)
                    {
                        System.Windows.Controls.Image img = (System.Windows.Controls.Image)((BlockUIContainer)root).Child;
                        System.Drawing.Bitmap bitmap = GetBitmap(img);
                    }
                    else
                    {
                        foreach (var item in ((Paragraph)root).Inlines)
                        {
                            //如果是Emoji则进行转换
                            if (item is InlineUIContainer)
                            {
                                System.Windows.Controls.Image img = (System.Windows.Controls.Image)((InlineUIContainer)item).Child;
                                resutStr += GetEmojiName(img.Source.ToString());
                            }
                            //如果是文本,    则直接赋值
                            if (item is Run)
                            {
                                resutStr += ((Run)item).Text;
                            }
                        }
                    }
                }
            }
        }

其中将System.Windows.Controls.Image转成System.Drawing.Imgage也是比较难整,在网上找到一个方法仅供参考

/// <summary>
        /// 将System.Windows.Controls.Image的BitmapSource转换为System.Drawing.Bitmap
        /// </summary>
        /// <param name="image"></param>
        /// <returns></returns>
        private System.Drawing.Bitmap GetBitmap(System.Windows.Controls.Image image)
        {
            System.Windows.Media.Imaging.BitmapSource transformedBitmapSource = image.Source as BitmapSource;

            int width = transformedBitmapSource.PixelWidth;
            int height = transformedBitmapSource.PixelHeight;
            int stride = width * ((transformedBitmapSource.Format.BitsPerPixel + 7) / 8);

            byte[] bits = new byte[height * stride];

            transformedBitmapSource.CopyPixels(bits, stride, 0);

            unsafe
            {
                fixed (byte* pBits = bits)
                {
                    IntPtr ptr = new IntPtr(pBits);

                    System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(
                        width,
                        height,
                        stride,
                        System.Drawing.Imaging.PixelFormat.Format32bppPArgb,
                        ptr);
                    return bitmap;
                }
            }
        }

需要更改工程的属性,在工程属性\"生成" 选中 “允许不安全代码”

至于获取QQ表情Emoji名以及绑定到RichTextBox方法可参考文中首行指向的地址博主源码

System.Drawing.Bitmap可以直接保存文件或者转System.Drawing.Imgage,这个就比较简单了 不知道百度即可。

下面是将图片或者文字追加到RichTextBox中

图片:

BlockUIContainer bl = new BlockUIContainer();
                            System.Windows.Controls.Image imgs = new System.Windows.Controls.Image();
                            System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(System.Drawing    .Image);
                            BitmapImage bitmapImage = new BitmapImage();
                            using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
                            {
                                bitmap.Save(ms, ImageFormat.Png);
                                bitmapImage.BeginInit();
                                bitmapImage.StreamSource = ms;
                                bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
                                bitmapImage.EndInit();
                                bitmapImage.Freeze();
                            }
                            imgs.Source = bitmapImage;
                            imgs.Width = Convert.ToDouble(150);
                            imgs.Height = Convert.ToDouble(100);
                            bl.Child = imgs;
                            RichTextBox.Document.Blocks.Add(bl);
                            RichTextBox.Focus();
                            System.Windows.Forms.SendKeys.SendWait("^{END}");//将光标移动到最后

文字:

Paragraph par = new Paragraph();
            par.Inlines.Add(new Run("文字内容"));
            RichTextBox.Document.Blocks.Add(par);
            RichTextBox.Focus();
            System.Windows.Forms.SendKeys.SendWait("^{END}");
时间: 2024-10-09 20:37:11

RichTextBox FlowDocument类型操作的相关文章

使用 redis (sort set排序集合类型操作)

sort set排序集合类型 释义: sort set 是 string 类型的集合 sort set 的每个元素 都会关联一个 权 通过 权值 可以有序的获取集合中的元素 应用场合: 获取热门帖子(回复量)信息: select * from message order by backnum desc limit 5; // 利用 sort set 实现最热门的前 5 贴信息 帖子id            回复量(万条) 11                102        12     

使用 redis (基础, key操作, string类型操作)

使用redis set 类型: 没有重复元素 list 链表类型 有重复累型 sort set 类型 没有重复元素 1.1 存储数据 读取数据 // 数据储存在 内存中 set name laowen // OK 表示成功 set age 22    // ok 表示成功 set add beijing // OK 表示成功 get name // "laowen" 表示获取成功 get age // "22" 表示获取成功 get addr // "be

使用 redis ( set集合类型操作)

set 集合类型 释义:            redis 的 set 是 string 类型的无序集合 set 元素最大可以包含(2的32次方-1)个元素 关于 set 集合类型除了基本的添加删除操作 其他有用的操作还包含集合的 并集(union),交集(intersection),差集(difference). 通过这些操作实现SNS中的 好友推荐功能 注意: 每个集合中的各个元素不能重复 应用场合: QQ好友的推荐 set 类型操作: sadd key member 添加一个 string

使用 redis ( list列表类型操作)

list 数据类型 列表类型 list 类型是一个双向操作 从链表的头部或者尾部添加删除元素 list 既可以用作栈 也可以用作队列 list 链表的类型应用场合: 获取最新的 10 个用户的信息 select * from user order by logintime desc limit 10; 数据不复杂 但是 对数据库的负载比较大 如给关键字 logintime 设置索引 耗费资源 用 redis 通过 list 链表实现以上功能 在 list 链表中只保留最新的10个数据 每一次进来

Redis - list类型操作

list类型操作设置操作:lpush:    lpush key value            在list左侧插入valuerpush:    rpush key value            在list右侧插入valuelinsert:    linsert key before value1 value2    在原来存在的value1前面插入value2lset:    lset key pos value            设置或修改指定pos下标的vaulelrem:   

Redis - hash类型操作

hash 类型操作设置操作:hset:    hset key filed value        创建指定key的filed-value名值对hsetnx:    hsetnx key filed value        创建不存在的key的filed-value名值对,已存在则创建失败hmset:    hmset key filed1 value1 filed2 value2    创建key对应的多个filed-valuehdel:    hdel key filed        

Redis - set类型操作

set类型操作设置操作:sadd:        sadd key value        给指定的key添加元素,重复返回0表示添加失败srem:        srem key value        删除key内的指定valuespop:        spop key            随机删除key内的一个valuesmove:        smove key1 key2 value    将key1内的value删除添加到key2内 集合操作:sdiff:        s

ACCESS中类型操作(限制、转换)

ACCESS如何保留两位小数 1.可以通过修改表结构中字段的“小数位数”即可. 2.可以通过“更新查询”,将所有该字段的值更新为round(字段名,2) ACCESS如何转换类型 每个函数都可以强制将一个表达式转换成某种特定数据类型.语法CBool(expression)CByte(expression)CCur(expression)CDate(expression)CDbl(expression)CDec(expression)CInt(expression)CLng(expression)

Android Sqlite对Date类型操作总结

首先,sqlite数据库在时间处理上和sqlserver还有oracle不同,下面根据自己做过的实例总结一下. 创建了一个Log数据表: LogID SourceID OperatorID LogType LogLevel LogTime              LogContent 1 aaa.aspx 0 2 1 2011-08-18 16:44:32.000 aaaa 2 bbb.aspx 1 2 2 2011-08-18 16:38:32.000 bbbb 3 ccc.aspx 2 3