我知道这篇文章有点老了,但我没有看到任何其他完整的答案,所以就这样吧。
在阅读原始问题时,我可以看到您可能希望如何将其实现为从主对话框启动的单独对话框,在这种情况下,您需要创建单独的 ComponentDialogs 来实现自己的 WaterfallDialog 来解决问题.
但是,如果您要问是否可以在单个 ComponentDialog 中拥有多个 WaterfallDialogs,是的,您当然可以。为此,您必须通过执行以下操作为每个 WaterfallDialog 分配一个 Id 属性值:
var flow1steps= new WaterfallStep[] { step1, step2, step3 };
var flow2steps = new WaterfallStep[] { step1, step2, step3 };
var flow1Dialog= new WaterfallDialog(nameof(WaterfallDialog), flow1steps) { Id = "flow1" };
var flow2Dialog = new WaterfallDialog(nameof(WaterfallDialog), flow2steps) { Id = "flow2" };
在这种情况下,如果您想从“flow1Dialog”开始,您可以将构造函数中的 InitialDialogId 设置为“flow1Dialog”,如下所示:
InitialDialogId = "flow1Dialog";
然后,当您准备好将对话框重定向到“flow2”时,您可以使用 flow2Dialog 的 WaterfallDialog.Id。例如,要从根对话框或 flow1Dialog 中的任何其他步骤重定向到 flow2Dialog,请执行以下操作:
return await stepContext.BeginDialogAsync("flow2");
BeingDialogAsync() 与 ReplaceDialogAsync()
您可以使用 BeginDialogAsync(),但除非您需要控制以最终返回到原始对话框,否则可能会导致您不想要的对话框堆栈混乱。使用 ReplaceDialogAsync() 将堆栈上的当前对话框替换为新对话框,这样可以更轻松地管理循环和重定向,因为堆栈不会被您不想在某些时候处理的旧对话框弄乱。