SuperSDK.Talk
SuperSDK AI 对话 UI 组件库,适用于 Avalonia 桌面应用。提供开箱即用的聊天界面、会话列表、通讯录、资料卡片和数据服务,以及与 SuperSDK MessageBus 的原生集成。
安装
dotnet add package SuncodeSoftware.SuperSDK.Talk
控件概览
所有控件的命名空间:
xmlns:talk="clr-namespace:SuperSDK.Talk.Controls;assembly=SuperSDK.Talk"
快速上手
典型三列布局(仿微信)
<Grid RowDefinitions="*,Auto">
<Grid Grid.Row="0" ColumnDefinitions="240,8,*,8,260" Height="600">
<talk:GzConversationBox Grid.Column="0"
BoxPadding="0"
BoxCornerRadius="6"
BoxBorderThickness="1"/>
<DockPanel Grid.Column="2">
<talk:GzInputBox DockPanel.Dock="Bottom"
SenderId="me"
SenderName="我"
Placeholder="输入消息…"
MinHeight="90"
BoxPadding="0"
BoxCornerRadius="6"
BoxBorderThickness="1"/>
<talk:GzChatBox BoxPadding="0"
BoxCornerRadius="6"
BoxBorderThickness="1"/>
</DockPanel>
<DockPanel Grid.Column="4">
<talk:GzProfileLiteBox DockPanel.Dock="Top"
BoxPadding="0"
BoxCornerRadius="0"
BoxBorderThickness="0"/>
<talk:GzContactBox BoxPadding="0"
BoxCornerRadius="6"
BoxBorderThickness="1"/>
</DockPanel>
</Grid>
<talk:GzDataBox Grid.Row="1"
Height="120"
IsVisible="True"
BoxPadding="6"
BoxCornerRadius="6"
BoxBorderThickness="1"/>
</Grid>
登录 / 初始化
所有控件只需发布一条 TalkOwnerChanged 即可完成初始化 — 无需逐个调用控件方法:
using SuperSDK.Core.Messaging;
using SuperSDK.Talk.Messages;
// 登录后广播一次,GzConversationBox / GzContactBox / GzInputBox /
// GzProfileLiteBox / GzDataBox 全部自动响应
MessageBus.Pub(new TalkOwnerChanged
{
UserId = "user_42",
DisplayName = "李四",
});
发送消息
// 文本消息(本人发)
MessageBus.Pub(new ChatMessageReceived
{
Message = TextChatMessage.Outbound("me", "我", "你好!")
});
// 文本消息(对方发)
MessageBus.Pub(new ChatMessageReceived
{
Message = TextChatMessage.Inbound("ai", "AI 助手", "你好,有什么可以帮你?")
});
// 图片消息
MessageBus.Pub(new ChatMessageReceived
{
Message = new ImageChatMessage
{
SenderId = "me",
SenderName = "我",
Direction = ChatDirection.Outbound,
FilePath = "/path/to/image.jpg",
Format = "jpg",
Caption = "附带说明", // 可选
Status = ChatMessageStatus.Sent,
}
});
// PDF 消息
MessageBus.Pub(new ChatMessageReceived
{
Message = new PdfChatMessage
{
SenderId = "me",
SenderName = "我",
Direction = ChatDirection.Outbound,
FilePath = "/path/to/doc.pdf",
PageCount = 5,
Caption = "请查阅此报告", // 可选
Status = ChatMessageStatus.Sent,
}
});
// 系统通知(居中气泡,无头像)
MessageBus.Pub(new ChatMessageReceived
{
Message = new SystemChatMessage("对话已开始")
});
清空消息
// 方式 A:直接调用控件方法
MyChatBox.Clear();
// 方式 B:通过 MessageBus(无需持有控件引用)
MessageBus.Pub(new ChatClearRequested());
加载通讯录
// 通讯录会在 TalkOwnerChanged 后自动从 DB 加载;
// 也可手动指定要显示的联系人 ID 列表:
MessageBus.Pub(new ContactBookLoadRequested
{
UserIds = new List<string> { "ai_alice", "ai_bob", "ai_charlie" }
});
手动展示联系人资料
// 弹出完整资料面板(通常由 GzProfileLiteBox 右键自动完成,也可手动触发)
var profileBox = new GzProfileBox { BoxPadding = new Thickness(20) };
profileBox.ShowContact(myAIContact); // AI 联系人模式
// 或
profileBox.ShowOwn(myUserEntity); // 我的资料模式
new Window { Content = profileBox, Width = 380, Height = 540 }.Show();
GzChatBox
公开 API
| 成员 |
类型 |
说明 |
BoxPadding |
Thickness |
外层内边距,默认 0 |
BoxCornerRadius |
CornerRadius |
外层圆角,默认 0 |
BoxBorderThickness |
Thickness |
外层边框粗细,默认 1 |
ChatBackground |
IBrush? |
消息列表背景,null 跟随全局主题自动切换 |
Clear() |
方法 |
清空所有已显示消息 |
DeleteMessage(Guid) |
方法 |
按 ID 软删除指定消息(O(1)),系统消息不可删 |
SetMessageStatus(Guid, ChatMessageStatus) |
方法 |
按 ID 更新投递状态(O(1)) |
SetMessageProcessing(Guid, bool) |
方法 |
开启/关闭指定消息气泡顶部的 AI 花瓣动画 |
AppendSubMessage(Guid, ChatSubMessage) |
方法 |
向指定父消息追加子消息时间轴节点 |
GetMessageSummaries() |
方法 |
返回所有对话消息摘要列表 (Id, SenderName, Preview) |
GetSystemMessages() |
方法 |
返回所有系统消息快照 (Id, Text, Timestamp) |
GetSubMessageSummaries(Guid) |
方法 |
返回指定父消息下的子消息摘要 (Id, Title) |
订阅的 MessageBus 消息
| 消息类型 |
触发效果 |
ChatMessageReceived |
追加一条新消息到列表 |
ChatClearRequested |
清空所有消息 |
ChatDeleteRequested |
按 ID 软删除指定消息 |
ChatMessageStatusChanged |
按 ID 更新消息投递状态 |
ChatSubMessageReceived |
向指定父消息追加子消息节点 |
ChatSubTaskStarted |
指定消息气泡顶部开启花瓣旋转动画 |
ChatSubTaskCompleted |
关闭花瓣动画,显示完成图标 |
ChatSubContentAppended |
向指定子消息节点追加内容片段(流式打字机) |
ChatSubNodeStatusChanged |
切换子消息节点的状态并可选覆盖内容 |
公开 API
| 成员 |
类型 |
说明 |
BoxPadding |
Thickness |
外层边距,默认 0 |
BoxCornerRadius |
CornerRadius |
外层圆角,默认 0 |
BoxBorderThickness |
Thickness |
外层边框粗细,默认 1 |
SenderId |
string |
发送方 ID,默认 "me" |
SenderName |
string |
发送方名称,默认 "我" |
Direction |
ChatDirection |
发出消息的方向,默认 Outbound;其他参与者设为 Inbound |
Placeholder |
string |
输入框占位文本 |
SetMember(id, name) |
方法 |
同时设置 SenderId 和 SenderName |
ClearQuote() |
方法 |
取消当前引用状态并隐藏引用预览条 |
订阅的 MessageBus 消息
| 消息类型 |
触发效果 |
TalkOwnerChanged |
更新 SenderId / SenderName(登录用户切换时) |
ChatQuoteRequested |
展示引用预览条,下次发送时自动附带引用 |
- 内含附件按钮,支持 jpg / jpeg / png / gif / webp / bmp / pdf
- 选择文件后显示预览徽章,可点 ✕ 取消;若同时填写文字,将作为
Caption 附带发送
- 按 Enter 发送,Shift+Enter 换行
- 不依赖
ChatBox,可独立使用
GzConversationBox
会话列表控件,展示当前登录用户的所有历史对话(仿微信左侧栏)。
公开 API
| 成员 |
类型 |
说明 |
BoxPadding |
Thickness |
外层内边距,默认 0 |
BoxCornerRadius |
CornerRadius |
外层圆角,默认 0 |
BoxBorderThickness |
Thickness |
外层边框粗细,默认 1 |
订阅的 MessageBus 消息
| 消息类型 |
触发效果 |
TalkOwnerChanged |
设置当前登录用户并重构会话列表 |
ContactConversationRequested |
确保该联系人已有会话行,如无则创建 |
ChatMessageReceived |
刷新对应会话行的消息预览和时间戳 |
ContactAliasChangeRequested |
就地更新对应会话行的显示名 |
通讯录控件,展示所有 AI 联系人。右键菜单提供「查看」(弹出 GzProfileBox 窗口)和「删除」。
公开 API
| 成员 |
类型 |
说明 |
BoxPadding |
Thickness |
外层内边距,默认 0 |
BoxCornerRadius |
CornerRadius |
外层圆角,默认 CornerRadius(8) |
BoxBorderThickness |
Thickness |
外层边框粗细,默认 1 |
订阅的 MessageBus 消息
| 消息类型 |
触发效果 |
TalkOwnerChanged |
从 DB 加载全部 AIContactEntity 并重建列表 |
ContactBookLoadRequested |
按指定 UserId 列表加载联系人 |
ContactAliasChangeRequested |
就地更新对应行的显示名,无需重启 |
发布的 MessageBus 消息
| 消息类型 |
触发时机 |
ContactConversationRequested |
双击联系人行 |
ContactDeleteRequested |
右键菜单删除确认 |
ContactAliasChangeRequested |
GzProfileBox 内保存别称 |
GzProfileLiteBox
用户/联系人资料的轻量卡片,仅展示头像圆圈 + 底部 1/3 叠层(名称 + ID),保持正方形外观。
右键 → 「查看详情」→ 弹出完整 GzProfileBox 窗口。
自动响应 TalkOwnerChanged,无需手动调用 ShowOwn。
公开 API
| 成员 |
类型 |
说明 |
BoxPadding |
Thickness |
内边距,默认 0 |
BoxCornerRadius |
CornerRadius |
圆角,默认 0 |
BoxBorderThickness |
Thickness |
边框粗细,默认 0(卡片形态,通常不显示边框) |
ShowOwn(UserEntity) |
方法 |
切换至「我的资料」模式 |
ShowContact(AIContactEntity) |
方法 |
切换至「AI 联系人资料」模式 |
订阅的 MessageBus 消息
| 消息类型 |
触发效果 |
TalkOwnerChanged |
自动加载登录用户头像卡片 |
ContactAliasChangeRequested |
联系人模式下同步别称 |
GzProfileBox
用户/联系人信息面板,支持两种模式。通常由 GzProfileLiteBox 的右键菜单弹出,也可独立使用。
- OwnProfile 模式(
ShowOwn(UserEntity)):展示登录用户信息,头像可点击更换,用户名可编辑
- ContactProfile 模式(
ShowContact(AIContactEntity)):展示 AI 联系人只读信息,支持修改别称
公开 API
| 成员 |
类型 |
说明 |
BoxPadding |
Thickness |
内边距,默认 Thickness(16) |
BoxCornerRadius |
CornerRadius |
圆角,默认 CornerRadius(12) |
ShowOwn(UserEntity) |
方法 |
切换至「我的资料」模式 |
ShowContact(AIContactEntity) |
方法 |
切换至「AI 联系人资料」只读模式 |
注:GzProfileBox 不订阅任何 MessageBus 消息。别称同步由 GzProfileLiteBox 负责;直接弹出使用时需手动调用 ShowOwn / ShowContact。
GzDataBox
数据库写入监控护栏,展示消息写入日志。通常直接放于聊天区域底部。
公开 API
| 成员 |
类型 |
说明 |
BoxPadding |
Thickness |
内边距,默认 0 |
BoxCornerRadius |
CornerRadius |
圆角,默认 CornerRadius(6) |
BoxBorderThickness |
Thickness |
边框粗细,默认 1 |
订阅的 MessageBus 消息
| 消息类型 |
触发效果 |
TalkOwnerChanged |
记录当前登录用户 ID |
ContactConversationRequested |
输出会话切换日志 |
ChatMessageReceived |
将消息写入 SQLite DB(ChatMessageEntity) |
命名空间统一为 SuperSDK.Talk.Messages,消息文件按用途分两个子目录。
💬 Display — 显示类消息
展示在 ChatBox 聊天列表中的实体消息类型。
| 类型 |
说明 |
构造方式 |
TextChatMessage |
纯文本,支持多行 |
TextChatMessage.Outbound(id, name, text) / .Inbound(...) |
ImageChatMessage |
图片(jpg/png/gif/webp/bmp),支持 Caption 附加文字 |
new ImageChatMessage { FilePath, Format, Caption?, ... } |
PdfChatMessage |
PDF 文件,支持 Caption 附加文字 |
new PdfChatMessage { FilePath, PageCount, Caption?, ... } |
SystemChatMessage |
系统通知,居中展示,无头像无气泡 |
new SystemChatMessage("文本") |
公共属性(所有消息类型):
| 属性 |
类型 |
说明 |
Id |
Guid |
全局唯一消息 ID(自动生成) |
Timestamp |
DateTime |
消息创建时间(自动生成) |
SenderId |
string |
发送方 ID |
SenderName |
string |
发送方显示名称 |
AvatarUri |
string? |
发送方头像 URI(null 用默认头像) |
Direction |
ChatDirection |
Outbound(右对齐)/ Inbound(左对齐)/ System(居中) |
Status |
ChatMessageStatus |
Pending / Sent / Delivered / Read / Failed |
QuotedMessage |
ChatMessage? |
被引用的消息(支持无限嵌套渲染) |
IsDeleted |
bool |
软删除标志(展示为"此消息已被删除") |
🔔 ChatSubMessage — AI 任务子消息节点
在消息气泡底部以时间轴形式展示的 AI 步骤节点。
var step = new ChatSubMessage
{
ParentMessageId = parentMsg.Id,
Title = "步骤 1:分析数据",
Content = "详细结果(可选,可展开查看)",
Status = ChatSubMessageStatus.InProgress,
NodeType = ChatSubMessageNodeType.Network,
};
MessageBus.Pub(new ChatSubMessageReceived { SubMessage = step });
| 属性 |
类型 |
说明 |
Id |
Guid |
子消息唯一 ID(自动生成) |
ParentMessageId |
Guid |
所属父消息 ID |
Title |
string |
节点标题(始终显示) |
Content |
string? |
可展开的详细内容,可通过 ChatSubContentAppended 流式追加 |
Status |
ChatSubMessageStatus |
InProgress(花瓣动画)/ Completed(绿勾)/ Failed(红叉) |
NodeType |
ChatSubMessageNodeType |
InProgress 时的图标:Default / Read / Write / Network / File / Compile / Run |
⚙️ Actions — 操作类消息
通过 MessageBus 触发控件行为的指令,全部通过消息唯一 ID 定位目标。
基础消息操作
| 消息类型 |
订阅方 |
触发效果 |
关键字段 |
ChatMessageReceived |
ChatBox |
展示新消息 |
Message (ChatMessage) |
ChatClearRequested |
ChatBox |
清空全部消息 |
无 |
ChatDeleteRequested |
ChatBox |
按 ID 软删除消息 |
MessageId (Guid) |
ChatMessageStatusChanged |
ChatBox |
更新消息投递状态 |
MessageId, NewStatus (ChatMessageStatus) |
ChatQuoteRequested |
ChatInputBox |
展示引用预览条,发送时自动附带引用 |
MessageId, SenderName, PreviewText, OriginalMessage |
AI 子消息操作
| 消息类型 |
订阅方 |
触发效果 |
关键字段 |
ChatSubMessageReceived |
ChatBox |
向父消息追加一个子节点 |
SubMessage (ChatSubMessage) |
ChatSubTaskStarted |
ChatBox |
父消息气泡顶部开启花瓣旋转动画 |
MessageId (Guid) |
ChatSubTaskCompleted |
ChatBox |
关闭花瓣动画,显示完成图标 |
MessageId (Guid) |
ChatSubContentAppended |
ChatBox |
向指定子节点 Content 末尾追加文本片段(流式打字机) |
ParentMessageId, SubMessageId, ContentChunk (string) |
ChatSubNodeStatusChanged |
ChatBox |
切换子节点状态(InProgress↔Completed↔Failed),可选同时覆盖内容 |
ParentMessageId, SubMessageId, NewStatus, NewContent? |
示例:AI 任务完整流程
// 1. 显示 AI 回复消息,开启花瓣动画
var aiMsg = TextChatMessage.Inbound("ai", "AI 助手", "好的,开始处理…");
MessageBus.Pub(new ChatMessageReceived { Message = aiMsg });
MessageBus.Pub(new ChatSubTaskStarted { MessageId = aiMsg.Id });
// 2. 追加进行中子节点
var step = new ChatSubMessage
{
ParentMessageId = aiMsg.Id,
Title = "步骤 1:读取文件",
Status = ChatSubMessageStatus.InProgress,
NodeType = ChatSubMessageNodeType.Read,
};
MessageBus.Pub(new ChatSubMessageReceived { SubMessage = step });
// 3. 流式向该节点追加内容(可多次调用)
MessageBus.Pub(new ChatSubContentAppended
{
ParentMessageId = aiMsg.Id,
SubMessageId = step.Id,
ContentChunk = "读取成功,共 1024 行。",
});
// 4. 将该节点切换为完成状态
MessageBus.Pub(new ChatSubNodeStatusChanged
{
ParentMessageId = aiMsg.Id,
SubMessageId = step.Id,
NewStatus = ChatSubMessageStatus.Completed,
});
// 5. 任务结束,关闭父消息花瓣动画
MessageBus.Pub(new ChatSubTaskCompleted { MessageId = aiMsg.Id });
主题
using SuperSDK.UI;
ThemeManager.ToggleTheme(); // 切换明/暗主题,所有控件自动响应
所有颜色均基于 Semi Avalonia 标准动态键(SemiColorBackground0-4、SemiColorText0-3、SemiColorBorder 等),无硬编码颜色。
MessageBus 消息完整清单
命名空间 SuperSDK.Talk.Messages,分 Actions(操作指令)和 Display(展示数据)两类。
所有消息均通过 MessageBus.Pub(msg) 发送、MessageBus.Subscribe<T>(this, handler) 订阅。
控件从视觉树卸载时调用 MessageBus.UnsubscribeAll(this) 一次性取消所有订阅。
📦 Display — 消息内容对象(不直接发布,包装在 ChatMessageReceived 里发布)
| 类型 |
文件路径 |
说明 |
ChatMessage |
Messages/Display/ChatMessage.cs |
抽象基类;含 Id, Timestamp, SenderId, SenderName, AvatarUri, Direction, Status, IsDeleted, QuotedMessage, ContentType, GetPreviewText() |
TextChatMessage |
Messages/Display/TextChatMessage.cs |
纯文本消息,Text 字段;静态工厂 .Outbound(id,name,text) / .Inbound(...) |
ImageChatMessage |
Messages/Display/ImageChatMessage.cs |
图片消息;FilePath, Format, Width, Height, FileSize, Caption? |
PdfChatMessage |
Messages/Display/PdfChatMessage.cs |
PDF 消息;FilePath, FileName, PageCount, FileSize, Caption? |
SystemChatMessage |
Messages/Display/SystemChatMessage.cs |
系统通知;居中无头像;构造器传入文本字符串 |
ChatSubMessage |
Messages/Display/ChatSubMessage.cs |
AI 步骤节点;Id, ParentMessageId, Title, Content?, Status, NodeType, Timestamp |
ChatDirection |
Messages/Display/ChatDirection.cs |
枚举:Outbound=0(右)/ Inbound=1(左)/ System=2(居中) |
ChatMessageStatus |
Messages/Display/ChatMessageStatus.cs |
枚举:Pending=0 / Sent=1 / Delivered=2 / Read=3 / Failed=4 |
ChatSubMessageStatus |
Messages/Display/ChatSubMessageStatus.cs |
枚举:InProgress=0 / Completed=1 / Failed=2 |
ChatSubMessageNodeType |
Messages/Display/ChatSubMessageNodeType.cs |
枚举:Default=0 / Read=1 / Write=2 / Network=3 / File=4 / Compile=5 / Run=6 |
ChatContentTypes |
Messages/Display/ChatContentTypes.cs |
字符串常量:"text" / "image" / "pdf" / "system" |
⚡ Actions — 操作指令消息(通过 MessageBus 发布以驱动控件行为)
聊天基础操作
| 消息类型 |
文件 |
默认订阅方 |
说明 |
关键字段 |
ChatMessageReceived |
Actions/ |
ChatBox (via ViewModel) |
向聊天列表追加一条消息 |
Message (ChatMessage) |
ChatClearRequested |
Actions/ |
ChatBox |
清空全部消息 |
无 |
ChatDeleteRequested |
Actions/ |
ChatBox |
按 ID 软删除消息 |
MessageId (Guid) |
ChatMessageStatusChanged |
Actions/ |
ChatBox |
更新消息投递状态 |
MessageId (Guid), NewStatus (ChatMessageStatus) |
ChatQuoteRequested |
Actions/ |
ChatInputBox |
展示引用预览条,下次发送自动附带引用 |
MessageId (Guid), SenderName, PreviewText, OriginalMessage (ChatMessage) |
AI 子消息操作
| 消息类型 |
文件 |
默认订阅方 |
说明 |
关键字段 |
ChatSubMessageReceived |
Actions/ |
ChatBox |
向父消息追加一个步骤节点 |
SubMessage (ChatSubMessage) |
ChatSubTaskStarted |
Actions/ |
ChatBox |
父消息气泡顶部开启花瓣旋转动画 |
MessageId (Guid) |
ChatSubTaskCompleted |
Actions/ |
ChatBox |
关闭花瓣动画,切换为完成图标 |
MessageId (Guid) |
ChatSubContentAppended |
Actions/ |
ChatBox |
向子节点 Content 末尾流式追加文本(打字机效果) |
ParentMessageId (Guid), SubMessageId (Guid), ContentChunk (string) |
ChatSubNodeStatusChanged |
Actions/ |
ChatBox |
切换子节点状态,可选同时覆盖内容文本 |
ParentMessageId, SubMessageId, NewStatus (ChatSubMessageStatus), NewContent? (string) |
| 消息类型 |
文件 |
默认订阅方 |
说明 |
关键字段 |
ContactBookLoadRequested |
Actions/ |
GzContactBox |
指定 UserId 列表,触发通讯录加载并渲染 |
UserIds (List<string>) |
ContactConversationRequested |
Actions/ |
GzChatBox (切换会话) / 宿主应用 |
双击/单击联系人后发出,请求打开与该用户的对话 |
UserId, DisplayName |
ContactDeleteRequested |
Actions/ |
宿主应用 |
联系人已从 DB 删除后发出 |
UserId, DisplayName |
ContactAliasChangeRequested |
Actions/ |
GzConversationBox, GzContactBox, GzProfileBox |
别称修改后三控件自动同步显示名 |
UserId, OldAlias, NewAlias |
用户 / 登录 / 会话列表(GzProfileBox / GzConversationBox)
| 消息类型 |
文件 |
默认订阅方 |
说明 |
关键字段 |
TalkOwnerChanged |
Actions/ |
GzConversationBox, GzContactBox, GzChatBox, GzInputBox, GzDataBox |
登录用户切换,所有相关控件自动响应加载 |
UserId (string), DisplayName (string) |
UserInfoUpdateRequested |
Actions/ |
宿主应用 / 任意模块 |
通过输入框或 UI 发送用户信息/指令 |
UserId (string), Content (string) |
🗃️ 数据库实体(SuperSDK.Data / SQLite,数据库文件 Talk.db)
| 实体类 |
表名 |
说明 |
主要字段 |
AIContactEntity |
AIContact |
AI 员工联系人,每条代表一个 AI 助手 |
UserId(必填), Username, Alias?, AvatarUri, Remark, CreatedAt + 计算 DisplayName(别称>用户名>ID), AvatarInitial |
UserEntity |
TalkUser |
真实用户(员工),系统中通常只有一条当前登录记录 |
UserId(必填), Username, AvatarUri, ContactIdsRaw(逗号分隔AI联系人ID), CreatedAt + GetContactIds(), SetContactIds(), AddContactId(), RemoveContactId() |
ChatMessageEntity |
ChatMessage |
持久化聊天消息,聚合所有类型字段 |
OwnerUserId, ContactUserId, ContentType("text/image/pdf/system"), Direction(0-2), Status(0-4), SenderId/SenderName/SenderAvatarUri, IsDeleted, QuotedMessageId?, TextContent?, FilePath?, FileName?, FileSize, ImageWidth/Height, PageCount, Caption?, ContentJson?, Timestamp + 计算 PreviewText |
ChatSubMessageEntity |
ChatSubMessage |
AI 回复子步骤持久化,外键关联父消息 |
ParentMessageId(必填→ChatMessageEntity.Id), Title, Content?, Status(0-2), NodeType(0-6), Timestamp |
实体注册(App.axaml.cs 中 SApp.Initialize 内):
config.RegisterEntity<AIContactEntity>();
config.RegisterEntity<UserEntity>();
config.RegisterEntity<ChatMessageEntity>();
config.RegisterEntity<ChatSubMessageEntity>();
🔌 控件快速对照
| 控件 |
文件 |
订阅的消息 |
发布的消息 |
GzChatBox |
Controls/GzChatBox.cs |
ChatMessageReceived, ChatClearRequested, ChatDeleteRequested, ChatMessageStatusChanged, ChatSubMessageReceived, ChatSubTaskStarted, ChatSubTaskCompleted, ChatSubContentAppended, ChatSubNodeStatusChanged, ContactConversationRequested(切换会话) |
ChatQuoteRequested(右键引用),ChatDeleteRequested(右键删除) |
GzInputBox |
Controls/GzInputBox.cs |
TalkOwnerChanged, ContactConversationRequested, ChatQuoteRequested |
ChatMessageReceived(发送按钮/Enter) |
GzConversationBox |
Controls/GzConversationBox.cs |
TalkOwnerChanged(加载会话列表),ContactConversationRequested(新增会话行),ChatMessageReceived(刷新预览),ContactAliasChangeRequested(同步别称) |
ContactConversationRequested(点击行) |
GzContactBox |
Controls/GzContactBox.cs |
TalkOwnerChanged(自动加载所有 AI 联系人),ContactBookLoadRequested,ContactAliasChangeRequested(同步行显示名) |
ContactConversationRequested(双击),ContactDeleteRequested(菜单删除),ContactAliasChangeRequested(菜单改别称) |
GzProfileLiteBox |
Controls/GzProfileLiteBox.cs |
TalkOwnerChanged(自动加载登录用户卡片),ContactAliasChangeRequested(联系人模式下同步别称) |
无(右键弹出 GzProfileBox 窗口) |
GzProfileBox |
Controls/GzProfileBox.cs |
无(由调用方手动调用 ShowOwn/ShowContact) |
ContactAliasChangeRequested(保存别称) |
GzDataBox |
Controls/GzDataBox.cs |
TalkOwnerChanged,ContactConversationRequested(日志),ChatMessageReceived(写入 DB) |
无 |