WPF 微信 MVVM 【续】发送部分QQ表情
今天主要记录的就是发送QQ表情, WPF 微信 MVVM里写了,后期为了发送QQ表情,需要把TextBox替换为RichTextBox,接下来就说说替换的过程。
一、支持Binding的RichTextBox
RichTextBox虽然支持文字,图片,链接,但是,原生的它不支持Binding,这个对于MVVM是很不方便的,因此,需要给RichTextBox设置一个依赖属性Document,来让它支持绑定,这样才能继续下一步。
public class BindableRichTextBox : RichTextBox
{
public new FlowDocument Document
{
get { return (FlowDocument)GetValue(DocumentProperty); }
set { SetValue(DocumentProperty, value); }
} // Using a DependencyProperty as the backing store for Document. This enables animation, styling, binding, etc...
public static readonly DependencyProperty DocumentProperty =
DependencyProperty.Register("Document", typeof(FlowDocument), typeof(BindableRichTextBox), new FrameworkPropertyMetadata(null,new PropertyChangedCallback(OnDucumentChanged))); private static void OnDucumentChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
RichTextBox rtb = (RichTextBox)d;
rtb.Document = (FlowDocument)e.NewValue;
}
}
BindableRichTextBox
二、微信表情列表
做列表的方法写在了Emoji选项列表这个博客里,不过因为是针对微信来做,所以,还是修改了一部分。
首先,右键查看微信网页版的源文件,会看到它的表情列表大概是这个样子的代码,从里面获取title和class里的内容,做成一个XML文件


然后,去网上找QQ的表情压缩包,这个不是难事,然后根据class进行命名,最后使用Emoji选项列表里的方法就可以做成列表了,看下效果图

三、String转FlowDocument、FlowDocument转String
网页版微信,在F12下,发送一条消息,可以看到发送的报文是“文字+[表情内容]”(指QQ的表情,Emoji现在没看到规律),因为,在转换的时候,也就有了目标

1、FlowDocument转换String
我们在点击发送按钮之前,是将发送框里的FlowDocument转换成String发送出去的。
转换过程是,循环FlowDocument里面的Blocks(Paragraph都放在Blocks里面),然后循环Paragraph里的Inlines,判别里面的内容是InlineUIContainer(Image)还是Run(Text)
如果是图片的话,则从Dictionary里取得Key,放到要发送的报文里,如果是文字的话,就直接放就可以了
private string GetSendMessage(FlowDocument fld)
{
if (fld == null)
{
return string.Empty;
}
string resutStr = string.Empty;
foreach (var root in fld.Blocks)
{
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;
}
}
}
return resutStr;
}
FlowDocument转String
2、String转FlowDocument
接收消息的是,拿到的是String类型,但是显示的时候要显示成FlowDocument。
因为我们知道了消息的格式是XXXX[**]这种,因此,就选用正则表达式进行截取就可以了。
首先,判断字符串的第一位是不是“[”,如果是的话,则截取[]里面的内容,转换为Image,然后将[**]从接收到的字符串上移除掉;
如果不是的话,则用正则表达式取得"["前面的值,作为Text,然后,将取到的值从接收到的字符串上移除掉,整个过程进行递归,直到字符串的长度变为0,跳出,将得到的内容最后添加到FlowDocument里
private void StrToFlDoc(string str,FlowDocument fld,Paragraph par)
{
//当递归结束以后,也就是长度为0的时候,就跳出
if (str.Length <= )
{
fld.Blocks.Add(par);
return;
}
//如果字符串里不存在[时,则直接添加内容
if (!str.Contains('['))
{
par.Inlines.Add(new Run(str));
str = str.Remove(, str.Length);
StrToFlDoc(str,fld, par);
}
else
{
//设置字符串长度
int strLength = str.Length;
//首先判断第一位是不是[,如果是,则证明是表情,用正则获取表情,然后将字符串长度进行移除,递归
if (str[].Equals('['))
{
par.Inlines.Add(new InlineUIContainer(new System.Windows.Controls.Image { Width = , Height = , Source = ContantClass.EmojiCode[GetEmojiNameByRegex(str)] }));
str = str.Remove(, GetEmojiNameByRegex(str).Length);
StrToFlDoc(str,fld, par);
}
else
{//如果第一位不是[的话,则是字符串,直接添加进去
par.Inlines.Add(new Run(GetTextByRegex(str)));
str = str.Remove(, GetTextByRegex(str).Length);
StrToFlDoc(str,fld, par);
}
}
}
String转FlowDocument
看下最终的效果图

四、总结
在把Textbox替换为RichTextBox过程中,遇到了不少阻碍,不像刚开始想的那么简单。
比如,点选表情添加到RichTextbox中时,发现有的时候光标并不在当前添加完的表情后面,而是在前面,或者是隔了一个跳跃,研究了大半天,在网上找到了解决办法。
var container=new InlineUIContainer(new Image { Source = EmojiTabControlUC.SelectEmoji.Value, Height = 20, Width = 20 }, rtb.CaretPosition);
rtb.CaretPosition = container.ElementEnd;
获取当前添加图片的位置,然后将位置重新定义为它之后。
还有,就是大家看到我的聊天框里的RichTextBox的长度是对等的,原来用TextBox时,会根据内容的长度进行变化,然后有一个最大长度,但是,我现在始终也没有找到如何让长度Auto的方法,请大神们告知如何搞定。
代码的话,继续是GitHub,地址的话,在WPF 微信 MVVM帖子里有,这里就不写了。
WPF 微信 MVVM 【续】发送部分QQ表情的更多相关文章
- WPF 微信 MVVM 【续】修复部分用户无法获取列表
看过我WPF 微信 MVVM这篇文章的朋友,应该知道我里面提到了我有一个小号是无法获取列表的,始终也没找到原因. 前两天经过GitHub上h4dex大神的指导,知道了原因,是因为微信在登录以后,web ...
- WPF 微信 MVVM
公司的同事离职了,接下来的日子可能会忙碌,能完善DEMO的时间也会少了,因此,把做的简易DEMO整体先记录一下,等后续不断的完善. 参考两位大神的日志:WEB版微信协议部分功能分析.[完全开源]微信客 ...
- [033] 微信公众帐号开发教程第9篇-QQ表情的发送与接收(转)
我想大家对QQ表情一定不会陌生,一个个小头像极大丰富了聊天的乐趣,使得聊天不再是简单的文字叙述,还能够配上喜.怒.哀.乐等表达人物心情的小图片.本文重点要介绍的内容就是怎样在微信公众平台使用QQ表情, ...
- [033] 微信公众帐号开发教程第9篇-QQ表情的发送与接收
我想大家对QQ表情一定不会陌生,一个个小头像极大丰富了聊天的乐趣,使得聊天不再是简单的文字叙述,还能够配上喜.怒.哀.乐等表达人物心情的小图片.本文重点要介绍的内容就是如何在微信公众平台使用QQ表情, ...
- QQ表情的发送与接收
我想大家对QQ表情一定不会陌生,一个个小头像极大丰富了聊天的乐趣,使得聊天不再是简单的文字叙述,还能够配上喜.怒.哀.乐等表达人物心情的小图片.本文重点要介绍的内容就是如何在微信公众平台使用QQ表情, ...
- 微信中QQ表情的解析(php)
微信公众平台接受的消息中,标签是用'/:'开头的字符串表示的,假设要在网页上显示(比方制作微信大屏幕),就须要进行转换. 所以我向微信公众平台按顺序发送了各个QQ表情,在微信公众平台后台能够看到接受的 ...
- CleanAOP实战系列--WPF中MVVM自动更新
CleanAOP实战系列--WPF中MVVM自动更新 作者: 立地 邮箱: jarvin_g@126.com QQ: 511363759 CleanAOP介绍:https://github.com/J ...
- 从0到1:使用Caliburn.Micro(WPF和MVVM)开发简单的计算器
从0到1:使用Caliburn.Micro(WPF和MVVM)开发简单的计算器 之前时间一直在使用Caliburn.Micro这种应用了MVVM模式的WPF框架做开发,是时候总结一下了. Calibu ...
- 经典qq表情插件(html+nodejs应用)
由于目前在接触聊天室项目,接到一个需求实现一个类似QQ表情.在网上找了一款jquery经典表情插件.下面介绍一个用法: HTML: 首先在html页面的head中引入jQuery库文件和QQ表情插件j ...
随机推荐
- ASP.NET Aries 入门开发教程6:列表数据表格的格式化处理及行内编辑
前言: 为了赶进度,周末也写文了! 前几篇讲完查询框和工具栏,这节讲表格数据相关的操作. 先看一下列表: 接下来我们有很多事情可以做. 1:格式化 - 键值的翻译 对于“启用”列,已经配置了格式化 # ...
- 使用 Roslyn 编译器服务
.NET Core和 .NET 4.6中 的C# 6/7 中的编译器Roslyn 一个重要的特性就是"Compiler as a Service",简单的讲,就是就是将编译器开放为 ...
- ASP.NET MVC学习之母版页和自定义控件的使用
一.母板页_Layout.cshtml类似于传统WebForm中的.master文件,起到页面整体框架重用的目地1.母板页代码预览 <!DOCTYPE html> <html> ...
- Java类变量和成员变量初始化过程
一.类的初始化 对于类的初始化:类的初始化一般只初始化一次,类的初始化主要是初始化静态成员变量. 类的编译决定了类的初始化过程. 编译器生成的class文件主要对定义在源文件中的类进行了如下的更改: ...
- arcgis api for js入门开发系列六地图分屏对比(含源代码)
上一篇实现了demo的地图标绘模块,本篇新增地图地图分屏对比模块,截图如下(源代码见文章底部): 对效果图的简单介绍一下,在demo只采用了两分屏对比,感兴趣的话,可以在两分屏的基础上拓展,修改css ...
- 完整部署CentOS7.2+OpenStack+kvm 云平台环境(1)--基础环境搭建
公司在IDC机房有两台很高配置的服务器,计划在上面部署openstack云平台虚拟化环境,用于承载后期开发测试和其他的一些对内业务.以下对openstack的部署过程及其使用做一详细介绍,仅仅依据本人 ...
- .NET Core dotnet 命令大全
dotnet 命令大全,让你理解dotnet 命令. 本文将以一个实例串起 dotnet 所有命令,让你玩转dotnet 命令. 本篇文章编写环境为windows 10 ,dotnet 命令同样适用于 ...
- 【腾讯优测干货分享】如何降低App的待机内存(三)——探索内存增长的原因
本文来自于腾讯优测公众号(wxutest),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/8BiKIt3frq9Yv9KV5FXlGw 1.3新问题的进一步挖 ...
- 在rem布局下使用背景图片以及sprite
现在移动端页面用rem布局已经是一大流派了,成熟的框架如淘宝的flexiable.js,以及我的好友@墨尘写的更轻量级的hotcss.用rem作单位使得元素能够自适应后,还有一块需要关注的,那就是背景 ...
- 如何利用 Visual Studio 自带工具提高开发效率
Visual Stuido 是一款强大的Windows 平台集成开发工具,你是否好好地利用了它呢? 显示行号 有些时候(比如错误定位)的时候,显示行号将有利于我们进行快速定位. 如何显示 1. 工具 ...