Диалоги водопада не были разработаны с идеей «идти назад», чтобы пройти их, хотя я вижу возможную необходимость.Единственное решение, которое я нашел, состоит в том, чтобы разбить ваш водопад на меньшие «мини» водопады и вложить их в один большой водопад.
// define and add waterfall dialogs (main)
WaterfallStep[] welcomeDialogSteps = new WaterfallStep[]
{
MainDialogSteps.PresentMenuAsync,
MainDialogSteps.ProcessInputAsync,
MainDialogSteps.RepeatMenuAsync,
};
Затем в MainDialogSteps.ProcessInputAsync:
public static async Task<DialogTurnResult> ProcessInputAsync(
WaterfallStepContext stepContext,
CancellationToken cancellationToken)
{
var choice = (FoundChoice)stepContext.Result;
var dialogId = Lists.WelcomeOptions[choice.Index].DialogName;
return await stepContext.BeginDialogAsync(dialogId, null, cancellationToken);
}
Это позволяет пользователям запускать новые диалоги, все еще находящиеся в главном стеке диалогов.Одним из предложенных мною вариантов был запрос списка телефонных номеров:
WaterfallStep[] phoneChoiceDialogSteps = new WaterfallStep[]
{
PhoneChoicePromptSteps.PromptForPhoneAsync,
PhoneChoicePromptSteps.ConfirmPhoneAsync,
PhoneChoicePromptSteps.ProcessInputAsync,
};
Add(new WaterfallDialog(Dialogs.PhonePrompt, phoneChoiceDialogSteps));
И, наконец, в PhoneChoicePromptSteps.ProcessInputAsync я позволил выбрать «нет» из подтверждения для ReplaceDialogAsync и эффективносбросить этот меньший водопад, не влияя на остальную часть общего водопада:
public static async Task<DialogTurnResult> ProcessInputAsync(
WaterfallStepContext stepContext,
CancellationToken cancellationToken)
{
if ((bool)stepContext.Result)
{
await stepContext.Context.SendActivityAsync(
$"Calling {stepContext.Values[Outputs.PhoneNumber]}",
cancellationToken: cancellationToken);
return await stepContext.EndDialogAsync(null, cancellationToken);
}
else
{
return await stepContext.ReplaceDialogAsync(Dialogs.PhonePrompt, null, cancellationToken);
}
}