Frameworks microsoft bot框架类型指示符表单流(表单生成器)

Frameworks microsoft bot框架类型指示符表单流(表单生成器),frameworks,botframework,bots,formflow,Frameworks,Botframework,Bots,Formflow,我需要在表单流中添加键入指示器活动,我使用了以下代码,但它只在表单流的一侧工作,一旦用户进入表单生成器,键入指示器就不会出现 Activity replytyping1 = activity.CreateReply(); replytyping1.Type = ActivityTypes.Typing; replytyping1.Text = null; ConnectorClient connector2 = new ConnectorClie

我需要在表单流中添加键入指示器活动,我使用了以下代码,但它只在表单流的一侧工作,一旦用户进入表单生成器,键入指示器就不会出现

 Activity replytyping1 = activity.CreateReply();
        replytyping1.Type = ActivityTypes.Typing;
        replytyping1.Text = null;
        ConnectorClient connector2 = new ConnectorClient(new Uri(activity.ServiceUrl));
        await connector2.Conversations.ReplyToActivityAsync(replytyping1);
我正在使用以下对话框内的代码调用表单生成器:

 var myform = new FormDialog<TrainingForm>(new TrainingForm(), TrainingForm.MYBuildForm, FormOptions.PromptInStart, null);
            context.Call<TrainingForm>(myform, AfterChildDialog);
var myform=new FormDialog(new TrainingForm(),TrainingForm.MYBuildForm,FormOptions.PromptInStart,null);
调用(myform,AfterChildDialog);
我的表单生成器代码:

  public enum MoreHelp { Yes, No };
public enum Helpfull { Yes, No };

[Serializable]
public class TrainingForm
{

    public string More = string.Empty;
    public string usefull = string.Empty;
    [Prompt("Is there anything else I can help you with today? {||}")]
    [Template(TemplateUsage.NotUnderstood, "What does \"{0}\" mean?", ChoiceStyle = ChoiceStyleOptions.Auto)]
    public MoreHelp? needMoreHelp { get; set; }

    [Prompt("Was this helpful? {||}")]
    [Template(TemplateUsage.NotUnderstood, "What does \"{0}\" mean?", ChoiceStyle = ChoiceStyleOptions.Auto)]
    public Helpfull? WasHelpful { get; set; }

    public static IForm<TrainingForm> MYBuildForm()
    {

        return new FormBuilder<TrainingForm>()
            .Field(new FieldReflector<TrainingForm>(nameof(needMoreHelp))
                        .SetActive(state => true)
                        .SetNext(SetNext2).SetIsNullable(false))

            .Field(new FieldReflector<TrainingForm>(nameof(WasHelpful))
                        .SetActive(state => state.More.Contains("No"))
                        .SetNext(SetNext).SetIsNullable(false)).OnCompletion(async (context, state) =>
                        {
                            if (state.usefull == "No")
                            {
                                await context.PostAsync("Sorry I could not help you");
                            }
                            else if (state.usefull == "Yes")
                            {
                                await context.PostAsync("Glad I could help");

                            }

                            if(state.More == "Yes")
                            {
                                await context.PostAsync("Ok! How can I help?");

                            }

                            context.Done<object>(new object());

                        })                 
                .Build();
        }
public enum MoreHelp{Yes,No};
公共枚举帮助信息{是,否};
[可序列化]
公开课培训表
{
publicstringmore=string.Empty;
public string usefull=string.Empty;
[提示(“今天还有什么我可以帮你的吗?{|}”)]
[模板(TemplateUsage.notUnderstanding,\“{0}\”是什么意思?”,ChoiceStyle=ChoiceStyleOptions.Auto)]
公共MoreHelp?需要MoreHelp{get;set;}
[提示(“这有用吗?{|}”)]
[模板(TemplateUsage.notUnderstanding,\“{0}\”是什么意思?”,ChoiceStyle=ChoiceStyleOptions.Auto)]
公共帮助全部?无用的{get;set;}
公共静态格式MYBuildForm()
{
返回新的FormBuilder()
.Field(新的FieldReflector(姓名(需要更多帮助))
.SetActive(状态=>true)
.SetNext(SetNext2).SetIsNullable(false))
.现场(新现场反射器(名称(WasHelpful))
.SetActive(state=>state.More.Contains(“否”))
.SetNext(SetNext).SetIsNullable(false)).OnCompletion(异步(上下文,状态)=>
{
如果(state.usefull==“否”)
{
等待上下文。PostAsync(“对不起,我帮不了你”);
}
else if(state.usefull==“是”)
{
等待上下文。PostAsync(“很高兴我能帮忙”);
}
如果(state.More==“是”)
{
等待上下文。PostAsync(“好的!我能帮什么忙?”);
}
context.Done(新对象());
})                 
.Build();
}

如果您试图从加载FormFlow对话框的对话框发送键入活动,它将不起作用,因为父对话框中的代码不会在每次加载FormFlow对话框时执行

但是,您可以修改MessagesController并检查对话框堆栈。如果FormFlow对话框是堆栈上的最后一个对话框,则发送键入:

    public async Task<HttpResponseMessage> Post([FromBody]Activity activity) {
        if (activity.Type == ActivityTypes.Message)
        {
            using (var scope = DialogModule.BeginLifetimeScope(Conversation.Container, activity))
            {
                var botData = scope.Resolve<IBotData>();
                await botData.LoadAsync(default(CancellationToken));

                var stack = scope.Resolve<IDialogTask>();                    
                if (stack.Frames != null && stack.Frames.Count > 0)
                {
                    var lastFrame = stack.Frames[stack.Frames.Count - 1];
                    var frameValue = lastFrame.Target.GetType().GetFields()[0].GetValue(lastFrame.Target);
                    if(frameValue is FormDialog<TrainingForm>)
                    {
                        var typingReply = activity.CreateReply();
                        typingReply.Type = ActivityTypes.Typing;

                        var connector = new ConnectorClient(new Uri(activity.ServiceUrl));
                        await connector.Conversations.ReplyToActivityAsync(typingReply);            

                    }
                }
            }

            await Conversation.SendAsync(activity, () => FormDialog.FromForm(TrainingForm.MYBuildForm));
        }
        else
        {
            this.HandleSystemMessage(activity);
        }

        return Request.CreateResponse(HttpStatusCode.OK); 
}
公共异步任务发布([FromBody]活动){
if(activity.Type==ActivityTypes.Message)
{
使用(var scope=DialogModule.BeginLifetimeScope(Conversation.Container,activity))
{
var botData=scope.Resolve();
等待botData.LoadAsync(默认值(CancellationToken));
var stack=scope.Resolve();
如果(stack.Frames!=null&&stack.Frames.Count>0)
{
var lastFrame=stack.Frames[stack.Frames.Count-1];
var frameValue=lastFrame.Target.GetType().GetFields()[0].GetValue(lastFrame.Target);
如果(frameValue为FormDialog)
{
var typingReply=activity.CreateReply();
typingReply.Type=ActivityTypes.Typing;
var connector=newconnectorclient(新Uri(activity.ServiceUrl));
等待连接器.Conversations.ReplyToActivityAsync(键入Reply);
}
}
}
wait Conversation.SendAsync(活动,()=>FormDialog.FromForm(TrainingForm.MYBuildForm));
}
其他的
{
此.HandleSystemMessage(活动);
}
返回Request.CreateResponse(HttpStatusCode.OK);
}

输入表单生成器键入指示器不出现
您可以尝试报告它。很抱歉,我是Bot框架的新手,我试图从IDialog类内部调用表单流,而不是从MessageControllert调用表单流我在这里提供的代码将检查堆栈上的最后一个对话框是否是特定的FormFlow对话框,并发送IsTyping活动(如果是)。您的表单可以从父对话框加载,也可以从MessagesController发送.IsTyping。