最近研究微信项目,套着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}");

RichTextBox FlowDocument类型操作的更多相关文章

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

    sort set排序集合类型 释义: sort set 是 string 类型的集合 sort set 的每个元素 都会关联一个 权 通过 权值 可以有序的获取集合中的元素 应用场合: 获取热门帖子( ...

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

    set 集合类型 释义:            redis 的 set 是 string 类型的无序集合 set 元素最大可以包含(2的32次方-1)个元素 关于 set 集合类型除了基本的添加删除操 ...

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

    list 数据类型 列表类型 list 类型是一个双向操作 从链表的头部或者尾部添加删除元素 list 既可以用作栈 也可以用作队列 list 链表的类型应用场合: 获取最新的 10 个用户的信息 s ...

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

    使用redis set 类型: 没有重复元素 list 链表类型 有重复累型 sort set 类型 没有重复元素 1.1 存储数据 读取数据 // 数据储存在 内存中 set name laowen ...

  5. Redis - list类型操作

    list类型操作 设置操作:lpush:    lpush key value            在list左侧插入value rpush:    rpush key value          ...

  6. Redis - set类型操作

    set类型操作 设置操作:sadd:        sadd key value        给指定的key添加元素,重复返回0表示添加失败. srem:         srem key valu ...

  7. Redis - hash类型操作

    hash 类型操作设置操作:hset:    hset key filed value        创建指定key的filed-value名值对 hsetnx:    hsetnx key file ...

  8. sql server Geometry 类型操作 笔记

    sqlGeometry 类型为sql server 2008之后的版本 新加的一种CLR扩展数据类型,为广大sql server开发人员存储几何类型及空间运算提供极大的便利,下面说明geometry类 ...

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

    ACCESS如何保留两位小数 1.可以通过修改表结构中字段的“小数位数”即可. 2.可以通过“更新查询”,将所有该字段的值更新为round(字段名,2) ACCESS如何转换类型 每个函数都可以强制将 ...

随机推荐

  1. hdu1558 Segment set

    Problem Description A segment and all segments which are connected with it compose a segment set. Th ...

  2. hdu2196 Compute

    Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission ...

  3. Codeforces Round #647 (Div. 2) - Thanks, Algo Muse! D. Johnny and Contribution (贪心,模拟)

    题意:有\(n\)个点,\(m\)条边,现在要给这些点赋值,,每次只能赋给某一点的四周(所连边)的最小没出现过的值.如果不能按照所给的数赋值,输出\(-1\),否则输出赋值顺序. 题解:我们用\(pa ...

  4. C# 静态类 单例模式 对比

    公司的类都需要使用单例模式实现,这个可以节省资源,避免重复对象的生成.但是静态类也可以做到这一点,而且写起来更简洁,于是查阅相关资料,希望弄明白两者的差别. 1.单例模式可以在用到的时候初始化,而静态 ...

  5. Spring Cloud实战: 基于Spring Cloud Gateway + vue-element-admin 实现的RBAC权限管理系统,实现网关对RESTful接口方法权限和自定义Vue指令对按钮权限的细粒度控制

    一. 前言 信我的哈,明天过年. 这应该是农历年前的关于开源项目 的最后一篇文章了. 有来商城 是基于 Spring Cloud OAuth2 + Spring Cloud Gateway + JWT ...

  6. python之字符串方法upper/lower

    1.描述: upper():用于将字符串全部转换为大写字母 lower():用于将字符串全部转换为小写字母 2.语法 str.upper() str.lower() 3.返回值 upper()或low ...

  7. python 3.7 安装 sklearn keras(tf.keras)

    # 1   sklearn  一般方法 网上有很多教程,不再赘述. 注意顺序是 numpy+mkl     ,然后 scipy的环境,scipy,然后 sklearn # 2 anoconda ana ...

  8. 线程池原理讲解——ThreadPoolExecutor

    [这是前几天的存货,留着没发表,今天又复习一遍,润化了部分内容,继续干] 说线程池前,先简单回顾一下线程的状态吧: 1.线程状态转换 线程的五种状态,及其转换关系: 2.线程创建方式 三种:两个接口一 ...

  9. sql-libs(5)

    直接只用floor报错注入  或者 update即可

  10. macOS 屏幕共享, 远程协助

    macOS 屏幕共享, 远程协助 Screen Sharing App 隐藏 app bug command + space 搜索 https://macflow.net/p/397.html Tea ...