You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bot Framework C#:点击按钮时关闭提示对话框

实现点击Yes/No提示框后自动关闭对话框

嘿,我刚好在Bot Framework里折腾过这个功能,其实核心逻辑没那么复杂,给你一步步拆解:

1. 先注册自带的ConfirmPrompt

首先不管你用C#还是JS/TS,都可以直接用框架自带的ConfirmPrompt来生成Yes/No提示框,先在你的对话框(比如组件对话框或者主对话框)里注册它:

// C#版本示例
public class MyCustomDialog : ComponentDialog
{
    public MyCustomDialog() : base(nameof(MyCustomDialog))
    {
        // 注册ConfirmPrompt,给它一个唯一ID
        AddDialog(new ConfirmPrompt(nameof(ConfirmPrompt)));
        
        // 用瀑布流来串联对话步骤
        AddDialog(new WaterfallDialog(nameof(WaterfallDialog), new WaterfallStep[]
        {
            ShowConfirmPromptStepAsync,
            HandleUserChoiceAndCloseDialogStepAsync
        }));

        // 设置瀑布流为初始对话
        InitialDialogId = nameof(WaterfallDialog);
    }
}

2. 发起Yes/No提示

在瀑布流的第一步,触发这个ConfirmPrompt,给用户显示带Yes/No按钮的对话框:

private async Task<DialogTurnResult> ShowConfirmPromptStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
{
    // 自定义提示文本,比如"是否确认删除这条记录?"
    return await stepContext.PromptAsync(
        nameof(ConfirmPrompt),
        new PromptOptions { Prompt = MessageFactory.Text("是否确认执行此操作?") },
        cancellationToken);
}

3. 处理用户选择并关闭对话框(关键!)

当用户点击Yes或No后,框架会把结果传到瀑布流的下一个步骤,这时候你只需要在这个步骤里调用EndDialogAsync(C#)或者endDialog()(JS/TS),就能让对话框自动关闭:

private async Task<DialogTurnResult> HandleUserChoiceAndCloseDialogStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
{
    // 获取用户的选择:true是Yes,false是No
    var userSelectedYes = (bool)stepContext.Result;
    
    // 这里可以根据用户选择做你需要的业务逻辑,比如记录操作、触发后续流程
    if (userSelectedYes)
    {
        await stepContext.Context.SendActivityAsync("已确认执行操作!", cancellationToken: cancellationToken);
    }
    else
    {
        await stepContext.Context.SendActivityAsync("已取消操作!", cancellationToken: cancellationToken);
    }
    
    // 核心代码:调用这个方法关闭当前对话框
    return await stepContext.EndDialogAsync(cancellationToken: cancellationToken);
}

补充:JS/TS版本的核心代码

如果你用的是JavaScript或TypeScript,思路完全一致,只是语法不同:

// 在对话框构造函数里注册Prompt和瀑布流
this.addDialog(new ConfirmPrompt('confirmPrompt'));
this.addDialog(new WaterfallDialog('waterfallDialog', [
    async (stepContext) => {
        // 发起提示
        return await stepContext.prompt('confirmPrompt', { prompt: '是否确认执行此操作?' });
    },
    async (stepContext) => {
        // 处理用户选择
        const userChoice = stepContext.result;
        await stepContext.context.sendActivity(userChoice ? '你选了Yes!' : '你选了No!');
        
        // 关闭对话框
        return await stepContext.endDialog();
    }
]));
this.initialDialogId = 'waterfallDialog';

小提醒

如果你是自己自定义的提示对话框(不是用框架自带的ConfirmPrompt),逻辑也是一样的:只要在捕获到用户点击按钮的事件后,调用结束对话框的方法就行。我当时一开始绕了弯路,后来发现就是差这一行结束对话框的代码😂

内容的提问来源于stack exchange,提问作者Martin Odongo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:03:13