我一直在尝试找出如何在显示轮播的步骤上“暂停”瀑布并等待用户输入。
我有一个可行的实现方式,但是我完全相信有更好的方法可以做到这一点。
在瀑布步骤中,我有以下代码:
if (search.Result != null && search.Result.Properties.Any())
{
var carousel = CarouselBuilder.BuildCarousel(search.Result);
await stepContext.Context.SendActivityAsync(carousel);
//return await stepContext.ContinueDialogAsync(cancellationToken);
return await stepContext.PromptAsync("propertySelected", new PromptOptions
{
}, cancellationToken);
}
我的propertySelected
对话框是这样的:
public class EventActivityPrompt : ActivityPrompt
{
public EventActivityPrompt(string dialogId, PromptValidator<Activity> validator)
: base(dialogId, validator)
{
}
}
需要这样的验证器:
public static class ActivityPromptValidator
{
public static async Task<bool> ActivityValidator(
PromptValidatorContext<Activity> promptContext,
CancellationToken cancellationToken)
{
return true;
}
}
这会将值传递到下一步确定
AddStep(async (stepContext, cancellationToken) =>
{
botState.InterestedPropertyIdentifier = stepContext.Result.ToString();
return await stepContext.BeginDialogAsync(MyNextDialog.Id, cancellationToken);
});
所有这些空块和一个仅返回true的验证器表明,这不是使此功能正常运行的最佳方法,但目前我对Bot Framework的经验不足,无法对此进行改进。我似乎也没有找到讨论此内容的文档。
如何最好地等待用户输入?
我认为BF v3中曾经有一种.Wait()
方法,这是我在该主题上可以找到的,但我已经在v4中找到了。
答案 0 :(得分:0)
问了这个问题已经有一段时间了,但是对于任何正在寻找一种实现的人,机器人会在该实现中为机器人提供一个带有(可能)按钮的英雄卡供您选择,而您希望在用户选择之前暂停一下(或文字),请使用
返回新的DialogTurnResult(DialogTurnStatus.Waiting);
示例:
var heroCard = new HeroCard
{
Title = "some title",
Subtitle = "some subtitle",
Text = "Please select one of the mentioned",
Buttons = cardObject
};
await stepContext.Context.SendActivityAsync(MessageFactory.Attachment(heroCard.ToAttachment()));
return new DialogTurnResult(DialogTurnStatus.Waiting);