Sender

AI 会话底部的消息输入条:自适应高度文本域 + 发送 / 停止按钮,Enter 发送 / Shift+Enter 换行、空内容禁用、Loading 变红色停止,Header 可挂 Attachments、Prefix 放工具、Footer 放提示。

最后更新

说明

面向 AI 会话“输入区”的受控输入条组件,除一个可选的聚焦方法外不依赖自定义 JS(自动增高用 CSS field-sizing)。核心是自适应高度文本域 + 右下角主操作按钮:Value / ValueChanged 支持 @bind-Value 双向绑定,发送成功后组件自动清空并经 OnSend(回传当前文本)通知宿主;Placeholder(默认“输入消息…”,作为翻译键)。SubmitOnEnter(默认 true)时 Enter 发送、Shift+Enter 换行,为 false 则仅按钮触发。Loading(生成中)时主按钮切换为红色停止图标并触发 OnStop,同时回车不发送;发送按钮图标 SendIcon(默认 send)、停止图标 StopIcon(默认 square),均不本地化。默认去除首尾空白后为空则禁用发送,AllowEmpty(默认 false)可放开空发送。AutoSize(默认 true)控制文本域是否随内容增高(关闭则固定单行、超出滚动),MaxLength(0 为不限)限制字数,禁用沿用 BaseComponent 的 Disabled。三个插槽便于组装完整输入区:Header 常挂 Attachments 附件条、Prefix 放附件 / 语音等触发按钮、Footer 放快捷键提示或字数统计。外观走 CSS 令牌接入框架明暗主题,聚焦时高描边;输入内容与插槽文案视为业务数据、仅“输入消息… / 发送 / 停止”走词条,常与 Bubble / Attachments / Think 组合成完整会话。

常见能力:

  • @bind-Value 双向绑定,发送后自动清空并经 OnSend 回传文本
  • SubmitOnEnter:Enter 发送 / Shift+Enter 换行(可关闭,仅按钮触发)
  • Loading 时主按钮变红色停止 + 触发 OnStop,且回车不发送;SendIcon / StopIcon 可换
  • 空内容默认禁用发送,AllowEmpty 放开;MaxLength 限字;Disabled 沿用基类
  • AutoSize 纯 CSS field-sizing 自动增高(无 JS),关闭则固定单行
  • Header 挂 Attachments、Prefix 放附件 / 语音按钮、Footer 放提示 / 字数
  • Placeholder / 发送 / 停止走词条,输入与插槽文案视为业务数据;明暗主题随 CSS 令牌适配

用法

<Sender @bind-Value="_text" Placeholder="输入消息,Enter 发送"
       Loading="@_gen" OnSend="Send" OnStop="Stop">
    <Header>
        @if (_files.Count > 0)
        {
            <Attachments Items="@_files" ListType="pill" Uploadable="false" OnRemove="Remove" />
        }
    </Header>
    <Prefix>
        <button class="tool" @onclick="AddFile"><Icon Type="paperclip" Size="16" /></button>
    </Prefix>
    <Footer><span>@(_text?.Length ?? 0) 字</span></Footer>
</Sender>

@code {
    string _text = "";
    bool _gen;
    void Send(string text) { _gen = true; /* 推入会话 + 请求模型 */ }
    void Stop() => _gen = false;
}

API 参数

参数 类型 默认值 说明
Actions RenderFragment null 工具栏右侧插槽,排在发送按钮之前:放模型选择、语音输入这类紧凑触发器。发送中它照样可点,因为「换模型 / 补口述」不该被一轮回答锁住。
AllowEmpty bool false 是否允许空内容发送。默认 false(去除首尾空白后为空则禁用发送)。
AutoSize bool true 文本域是否随内容自动增高。默认 true(CSS field-sizing,无 JS)。
Footer RenderFragment null 底部插槽(可放快捷键提示、字数统计等说明)。
Header RenderFragment null 顶部插槽(可放 Attachments 附件条等)。
Loading bool false 是否处于“生成中”:主按钮变为停止、回车不发送。默认 false。
MaxLength int 0 最大字符数,0 表示不限制。
OnSend EventCallback<string> — 事件 发送回调,回传当前文本。
OnStop EventCallback — 事件 生成中点击停止的回调。
Placeholder string "输入消息…" 占位文字(作为翻译键)。默认“输入消息…”。
Prefix RenderFragment null 工具栏左侧插槽(可放附件 / 语音等触发按钮)。
SendIcon string "send" 发送按钮图标名(Icon Type,不本地化)。
StopIcon string "square" 停止按钮图标名(Icon Type,不本地化)。
SubmitOnEnter bool true 是否用 Enter 发送(Shift+Enter 换行)。默认 true;为 false 时仅按钮发送。
Value string null 输入的文本(支持 @bind-Value 双向绑定)。
ValueChanged EventCallback<string> — 事件
Visible bool true 取得或设置组件是否可见,默认为false。
VisibleChanged EventCallback<bool> — 事件 取得或设置组件可见性变化时的回调事件。
Class string null 取得或设置组件的CSS类名,用于自定义样式。
Disabled bool false 取得或设置组件是否禁用,默认为false。
Style string null 取得或设置组件的内联样式,用于自定义样式。

所有组件均继承 BaseComponent,除上表参数外还支持 Class、Style、Disabled、Visible。

微信公众号二维码 扫码关注公众号
QQ 交流群二维码 扫码加入 QQ 群