服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - C#实现聊天消息渲染与图文混排详解

C#实现聊天消息渲染与图文混排详解

2023-05-29 11:49zhuweisky C#

在实现聊天软件时,渲染文字表情图文混排是一项非常繁琐的工作,再加上还要支持GIF动图、引用消息、撤回消息、名片等不同样式的消息渲染时,就更加麻烦了。本文就来和大家分享一下具体实现方法,希望对大家有所帮助

在实现聊天软件时,渲染文字表情图文混排是一项非常繁琐的工作,再加上还要支持GIF动图、引用消息、撤回消息、名片等不同样式的消息渲染时,就更加麻烦了。

好在我们可以使用 ESFramework 提供的 IChatRender 组件,使用它我们就能轻松实现类似于微信聊天消息的渲染效果。IChatRender 支持 Windows、Linux(包括国产OS)。在Windows平台上提供了基于 WinForm 和基于 WPF 的实现,在Linux上则是基于.NET Core 实现的。

废话不多说,先上张渲染Demo的效果图(该Demo源码可于文末下载):   

C#实现聊天消息渲染与图文混排详解

效果还不错吧!下面我们就简单介绍下如何使用 IChatRender 实现上图所展示的渲染效果,大家下载源码对照着看,会更容易理解。

一.支持的聊天消息类型

IChatRender 支持渲染的聊天消息类型包括: 

(1)文本表情混排。

(2)图片,GIF 动图。

(3)文件传输进度及控制。

(4)个人名片、群名片。

(5)引用消息。

(6)语音消息。

(7)语音通话。

(8)视频通话。 

(9)撤回消息、删除消息。       

二.IChatRender 接口定义

IChatRender 接口的定义具体如下所示:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
/// <summary>
        /// 渲染名片
        /// </summary>
        /// <param name="msgID">聊天记录ID</param>
        /// <param name="userID">发送者</param>
        /// <param name="cardUserID">名片上的个人ID</param>
        /// <param name="index">插入聊天记录的位置,默认是放到最后面</param>
        void AddChatItemCard(string msgID ,string userID, string cardUserID ,int? index = null);
 
        /// <summary>
        /// 渲染文件
        /// </summary>
        /// <param name="fileName">文件名称</param>
        /// <param name="fileSize">文件大小</param>
        /// <param name="state">文件状态</param>
        void AddChatItemFile(string msgID, string userID, string fileName, ulong fileSize, FileTransState state, int? index = null);
 
        /// <summary>
        /// 渲染图片
        /// </summary>
        /// <param name="image">图像</param>
        /// <param name="imgSize">图像大小</param>
        /// <param name="observerable">默认传null</param>
        void AddChatItemImage(string msgID, string userID, object image, Size imgSize ,IProgressObserverable observerable = null, int? index = null);
 
        /// <summary>
        /// 渲染文本表情
        /// </summary>
        /// <param name="text">内容,在渲染文本的内容中用 [000]来代表第一个表情,[001]即是二个表情,以此类推</param>
        /// <param name="referenced">引用内容可以是文本、图片、文件或名片</param>
        /// <param name="textColor">文字颜色</param>
        void AddChatItemText(string msgID, string userID, string text, ReferencedChatMessage referenced = null, Color? textColor = null, int? index = null);
 
        /// <summary>
        /// 渲染悄悄话,默认显示内容—>> 悄悄话
        /// </summary>
        void AddChatItemSnap(string msgID, string userID, int? index = null);
 
        /// <summary>
        /// 渲染语音消息
        /// </summary>
        /// <param name="audioMessageSecs">语音时长</param>
        /// <param name="audioMessage">语音短信</param>
        void AddChatItemAudio(string msgID, string userID, int audioMessageSecs, object audioMessage, int? index = null);
 
        /// <summary>
        /// 渲染多媒体通话类型
        /// </summary>
        /// <param name="duration">通话时长</param>
        /// <param name="isAudioCommunicate">通话类型(语音/视频)</param>
        void AddChatItemMedia(string msgID, string userID, string duration, bool isAudioCommunicate, int? index = null);
 
        /// <summary>
        /// 渲染系统消息
        /// </summary>
        /// <param name="msg">系统消息内容</param>
        void AddChatItemSystemMessage(string msg, int? index = null);
 
        /// <summary>
        /// 渲染消息的发送时间
        /// </summary>
        /// <param name="dt">发送时间</param>
        void AddChatItemTime(DateTime dt, int? index = null);  
 
        /// <summary>
        /// 自己撤回消息
        /// </summary>
        void RecallChatMessage(string msgID);
 
        /// <summary>
        /// 其他用户撤回消息
        /// </summary>
        /// <param name="operatorName">操作者</param>
        void RecallChatMessage(string msgID ,string operatorName);
 
        /// <summary>
        /// 删除对应的记录
        /// </summary>
        void RemoveChatMessage(string msgID);

三. 创建 IChatRender 实例

可以通过调用ESFramework.Extensions.ChatRendering.ChatRenderFactory 的静态方法 CreateChatRender 创建一个 IChatRender 实例。

?
1
2
3
4
5
6
7
/// <param name="provider">提供必要的信息给聊天渲染器</param>
        /// <param name="ctrl">要在其表面渲染的UI控件</param>
        /// <param name="myID">自己的ID</param>
        /// <param name="destID">对方ID、或群ID</param>
        /// <param name="isGroup">群聊/单聊</param>
        /// <returns></returns>
        public static IChatRender CreateChatRender(IRenderDataProvider provider, IChatControl ctrl, string myID, string destID, bool isGroup);

第一个参数 IRenderDataProvider 用于在 IChatRender  渲染时,能从该接口获取必要的信息(如用户的头像、名称、表情图片等)。 

第二个参数 则是要在其表面进行渲染的UI控件。 

四. Demo 源码下载

ChatRenderDemo 源码链接: Windows 端 + Linux 端 源码 提取码:6daw

源码解决方案中包括三个项目:

(1)ChatRenderDemo.WPF:   该Demo的Windows端(基于WPF)。

(2)ChatRenderDemo.WinForm: 该Demo的Windows端(基于WinForm)。 

(3)ChatRenderDemo.Linux:     该Demo的Linux客户端(基于.NetCore),支持在统信UOS、银河麒麟等国产OS上运行。  

注:Linux 端内置的是x86/x64非托管so库,若需要其它架构的so,可以评论区留下email,到时我会发给大家。  

以上就是C#实现聊天消息渲染与图文混排详解的详细内容,更多关于C#聊天消息渲染图文混排的资料请关注服务器之家其它相关文章!

原文链接:https://www.cnblogs.com/zhuweisky/p/17095413.html

延伸 · 阅读

精彩推荐
  • C#SuperSocket封装成C#类库的步骤

    SuperSocket封装成C#类库的步骤

    这篇文章主要介绍了SuperSocket封装成C#类库的步骤,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下...

    xhubobo3842022-10-26
  • C#C#提升性能的几点提示和技巧

    C#提升性能的几点提示和技巧

    今天我想分享一些C#性能技巧,这些技巧对我的最新工作有所帮助。其中一些功能在你看来也许相当微不足道,因此请不要在这里充电并使用所有功能。...

    DotNET技术圈3732021-10-14
  • C#c#二叉树存储介绍

    c#二叉树存储介绍

    大家好,本篇文章主要讲的是c#二叉树存储介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览...

    Alvation.9422022-12-12
  • C#C#9.0新特性详解——顶级程序语句(Top-Level Programs)

    C#9.0新特性详解——顶级程序语句(Top-Level Programs)

    这篇文章主要介绍了C#9.0新特性详解——顶级程序语句(Top-Level Programs)的相关资料,帮助大家更好的理解和学习c#,感兴趣的朋友可以了解下...

    码客风云6142022-10-20
  • C#c# webapi 配置swagger的方法

    c# webapi 配置swagger的方法

    这篇文章主要介绍了c# webapi 配置swagger的方法,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下...

    团队buff工具人9452022-09-23
  • C#C#读写指定编码格式的文本文件

    C#读写指定编码格式的文本文件

    这篇文章主要为大家详细介绍了C#读写指定编码格式文本文件的方法,感兴趣的小伙伴们可以参考一下...

    吴超10952021-11-15
  • C#c# 实现发送邮件到指定邮箱

    c# 实现发送邮件到指定邮箱

    这篇文章主要介绍了c# 如何实现发送邮件到指定邮箱,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下...

    熊泽-学习中的苦与乐11942022-11-07
  • C#C#中Entity Framework常见报错汇总

    C#中Entity Framework常见报错汇总

    给大家总结了C#中Entity Framework常见报错,以及处理这些错误的方法,希望能够为你提供到帮助。...

    C#教程网8412022-02-13