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
相关产品推荐
相关产品推荐

