Как добавить более 10 кнопок для фреймворка ChoicePrompt Bot V4 c # - PullRequest
1 голос
/ 24 апреля 2019

Я использую ChoicePrompt в WaterfallStep для отображения вариантов.Проблема в том, что если список выбора больше 10, я не получаю кнопки, это отображается как текст.Пожалуйста, помогите мне, как исправить эту ошибку.

 var waterfallSteps = new WaterfallStep[]
        {
            InitializeStateStepAsync,
            PromptShowChoiceStepAsync,
            DisplaySuccessStepAsync,
        };
        AddDialog(new WaterfallDialog("waterfallDialog", waterfallSteps));
        AddDialog(new ChoicePrompt("ShowChoicePrompt", ValidateShowChoice));

 private async Task<DialogTurnResult> ValidateShowChoice(WaterfallStepContext stepContext, CancellationToken cancellationToken)
{
   return await stepContext.PromptAsync("ShowChoicePrompt", new PromptOptions
            {
                Prompt = MessageFactory.Text("Please select from choices"),
                RetryPrompt = MessageFactory.Text("Sorry, Please the valid choice"),
                Choices = ChoiceFactory.ToChoices(choicesList),
            }, cancellationToken);
        }
    }

Если choicesList count больше 10, я получаю такие кнопки.Что не является проблемой в платформе ботов V3.

Please select from choices
1. Choice-1
2. Choice-2
3. Choice-3
4. Choice-4
5. Choice-5
6. Choice-6
7. Choice-7
8. Choice-8
9. Choice-9
10. Choice-10
11. Choice-11
12. Choice-12
13. Choice-13

Пожалуйста, помогите мне, как устранить эту ошибку.

Ответы [ 2 ]

1 голос
/ 25 апреля 2019

Эти варианты отображения сделаны из-за ограничений / рекомендаций по используемым каналам.

Если вы загляните на страницу разработчика Facebook Messenger о Quick replies здесь , она гласит:

Быстрые ответы предоставляют способ представления набора из до 11 кнопок в разговоре, которые содержат заголовок и дополнительное изображение и расположены заметно над композитором.Вы также можете использовать быстрые ответы, чтобы запросить местоположение человека, адрес электронной почты и номер телефона.

Как следствие, в коде BotBuilder, доступном на Github, у вас будет метод Determine if a number of Suggested Actions are supported by a Channel здесь :

/// <summary>
/// Determine if a number of Suggested Actions are supported by a Channel.
/// </summary>
/// <param name="channelId">The Channel to check the if Suggested Actions are supported in.</param>
/// <param name="buttonCnt">(Optional) The number of Suggested Actions to check for the Channel.</param>
/// <returns>True if the Channel supports the buttonCnt total Suggested Actions, False if the Channel does not support that number of Suggested Actions.</returns>
public static bool SupportsSuggestedActions(string channelId, int buttonCnt = 100)
{
    switch (channelId)
    {
        // https://developers.facebook.com/docs/messenger-platform/send-messages/quick-replies
        case Connector.Channels.Facebook:
        case Connector.Channels.Skype:
            return buttonCnt <= 10;

        // ...
    }
}

Затем в используемом вами ChoiceFactory выбран экран (см. Код здесь ):

public static IMessageActivity ForChannel(string channelId, IList<Choice> list, string text = null, string speak = null, ChoiceFactoryOptions options = null)
{
    channelId = channelId ?? string.Empty;

    list = list ?? new List<Choice>();

    // Find maximum title length
    var maxTitleLength = 0;
    foreach (var choice in list)
    {
        var l = choice.Action != null && !string.IsNullOrEmpty(choice.Action.Title) ? choice.Action.Title.Length : choice.Value.Length;
        if (l > maxTitleLength)
        {
            maxTitleLength = l;
        }
    }

    // Determine list style
    var supportsSuggestedActions = Channel.SupportsSuggestedActions(channelId, list.Count);
    var supportsCardActions = Channel.SupportsCardActions(channelId, list.Count);
    var maxActionTitleLength = Channel.MaxActionTitleLength(channelId);
    var hasMessageFeed = Channel.HasMessageFeed(channelId);
    var longTitles = maxTitleLength > maxActionTitleLength;

    if (!longTitles && !supportsSuggestedActions && supportsCardActions)
    {
        // SuggestedActions is the preferred approach, but for channels that don't
        // support them (e.g. Teams, Cortana) we should use a HeroCard with CardActions
        return HeroCard(list, text, speak);
    }
    else if (!longTitles && supportsSuggestedActions)
    {
        // We always prefer showing choices using suggested actions. If the titles are too long, however,
        // we'll have to show them as a text list.
        return SuggestedAction(list, text, speak);
    }
    else if (!longTitles && list.Count <= 3)
    {
        // If the titles are short and there are 3 or less choices we'll use an inline list.
        return Inline(list, text, speak, options);
    }
    else
    {
        // Show a numbered list.
        return List(list, text, speak, options);
    }
}

Вот почему вы получили список, если вы предоставили более 10 наименований.

Как правило, рекомендуется ограничить количество кнопок, более 10 - это огромно.Вы можете адаптировать свое поведение (например, группировка элементов / добавление дополнительного уровня выбора по группам)

0 голосов
/ 15 мая 2019

Выбор подсказывает в v3 используемые карты героев по умолчанию.Вы можете заставить свои подсказки использовать карты героев с новой опцией HeroCard в перечислении ListStyle.Стиль списка можно применять непосредственно к приглашению при добавлении его в набор диалогов:

AddDialog(new ChoicePrompt("ShowChoicePrompt", ValidateShowChoice) { Style = ListStyle.HeroCard });

Теперь у вас также есть возможность указать стиль списка в параметрах приглашения:

return await stepContext.PromptAsync("ShowChoicePrompt", new PromptOptions
{
    Prompt = MessageFactory.Text("Please select from choices"),
    RetryPrompt = MessageFactory.Text("Sorry, Please the valid choice"),
    Choices = ChoiceFactory.ToChoices(choicesList),
    Style = ListStyle.HeroCard,
}, cancellationToken);

Хотя использование в сообщении слишком большого числа кнопок является плохой практикой, и большинство каналов применяют это соглашение, не допуская большого количества кнопок на карте, соединители для Facebook и Skype автоматически генерируют несколько карт, если вы попытаетесьположить слишком много кнопок на одну карту.

В Facebook Messenger это будет выглядеть так:

Facebook Messenger

В Skype это будет выглядеть такэто:

Skype

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...