仅在更改提示中隐藏“无首选项”按钮

时间:2019-04-17 20:28:34

标签: c# botframework formflow

我只想在表单流的“更改提示”中删除“无首选项”,或者至少仅对确认提示更改其文本,而将表单的“无首选项”选项保留下来。

我能够更改其文本,但它更改了整个表格,对我不起作用。

enter image description here

public static IForm<PromoBot> BuildForm()
    var form = new FormBuilder<PromoBot>()
        .Message("Hi......!")
        .Field(nameof(Nome), validate: async (state, value) =>
            {
                ..........
                result.IsValid = true;
                return result;
            }, active: state => true)
        .Message("xxxxxx")
        .Field(nameof(CEP)
        .Field(nameof(Estados))
        .Confirm(async (state) =>
        {
            return new PromptAttribute("You have selected the following:  \n {*} "Is this correct?{||}");
        })
        .Message("Excelente! Agora vou precisar de alguns segundos para encontrar o melhor plano para sua empresa… já volto!")
        .OnCompletion(OnComplete);

    var noPreferenceStrings = new string[] { "New Text" };
    form.Configuration.Templates.Single(t => t.Usage == TemplateUsage.NoPreference).Patterns = noPreferenceStrings;
    form.Configuration.NoPreference = noPreferenceStrings;

    return form.Build();
}

1 个答案:

答案 0 :(得分:1)

通常,您可以使用模板属性来修改FormFlow的行为,但是导航步骤有点棘手。我认为在这种情况下最好的做法是为您的表单提供一个custom prompter

在您的情况下,代码可能如下所示:

public static IForm<MyClass> BuildForm()
{
    var formBuilder = new FormBuilder<MyClass>()
        .Field(nameof(FirstName))
        .Field(nameof(LastName))
        .Confirm("Is this okay? {*}")
        .Prompter(PromptAsync)
        ;

    return formBuilder.Build();
}

/// <summary>
/// Here is the method we're using for the PromptAsyncDelgate.
/// </summary>
private static async Task<FormPrompt> PromptAsync(IDialogContext context, FormPrompt prompt,
    MyClass state, IField<MyClass> field)
{
    var preamble = context.MakeMessage();
    var promptMessage = context.MakeMessage();

    // Check to see if the form is on the navigation step
    if (field.Name.Contains("navigate") && prompt.Buttons.Any())
    {
        // If it's on the navigation step,
        // we want to change or remove the No Preference line

        if (you_want_to_change_it)
        {
            var noPreferenceButton = prompt.Buttons.Last();
            // Make sure the Message stays the same or else
            // FormFlow won't know what to do when this button is clicked
            noPreferenceButton.Message = noPreferenceButton.Description;
            noPreferenceButton.Description = "Back"; 
        }
        else if(you_want_to_remove_it)
        {
            prompt.Buttons.RemoveAt(prompt.Buttons.Count - 1);
        }
    }

    if (prompt.GenerateMessages(preamble, promptMessage))
    {
        await context.PostAsync(preamble);
    }

    await context.PostAsync(promptMessage);

    return prompt;
}

另外一个注意事项:“ Back”实际上是FormFlow中的特殊命令。 “无首选项”将带您返回到确认步骤,而“上一步”将带您返回到表单的最后一个字段。如果要在导航步骤中实际放置一个后退按钮,则可以省略以下行:

noPreferenceButton.Message = noPreferenceButton.Description;