2017-06-24 24 views
0

我對RootDialog有以下要求: 1)向用戶提供一組選擇; 2)但與此同時,讓用戶隨意問我什麼,甚至與提供的​​選項無關,並將其轉發給QnAMaker;使用與CardAction類似的AdaptativeCard創建按鈕列表?

爲了適應我第一次tryed這

private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<object> result) 
{ 
    PromptDialog.Choice(context, OnOptionSelected, options, "Sobre o que você deseja falar ?", "Você deve escolher entre uma das opções a seguir"); 
} 

在這種情況下,OnOptionSelected方法成功地稱爲第一要求。偉大的:)

但是當我試圖推敲第二個要求時,我意識到「Prompt.Choice」策略不是一個好的選擇,導致它停止調用我的「MessageReceivedAsync」方法,如果用戶鍵入的somithing不同於提示的選項。用戶 在這種情況下,我已經變得無法處理文本自由輸入,因爲

PromptDialog.Choice(context, OnOptionSelected, options, "Sobre o que você deseja falar ?", "Você deve escolher entre uma das opções a seguir"); 

已經創建了自己的對話框中的對話堆棧的頂部,防止我的RootDialog處理由鍵入的文本用戶;

然後,我已經有了一個聰明的想法來替換「PromptDialog.Choice」到AdaptativeCard來呈現帶有我想要的選項的按鈕,但不更改我的對話框堆棧,因此如果用戶輸入完全不同的選項我已經向他展示了,我可以將其轉發給Q &製造商。

要創建我AdaptativeCard我用像波紋管一SubmitAction:

card.Actions.Add(new SubmitAction 
       { 
        Title = option, 
        Data = option 
       }); 

但問題是,當用戶點擊SubmitAction(呈現爲一個按鈕,在模擬器上)按鈕的文本用戶已經點擊了不會看到的對話,而是沉迷於我的MessageReceivedAsync方法。 有什麼辦法可以使用AdaptativeCard創建一個按鈕列表,其行爲與VideoCard.Buttons上使用的CardAction類似?我的意思是一張卡片,當你點擊它時,你可以看到它的文本就像按鈕對面的TextBlock一樣?

+0

爲什麼選擇自適應卡而不只是帶按鈕的英雄卡?此外,使用提示選項是可行的,但您需要從中繼承來定製它;你有沒有考慮這種方法? –

+0

HeroCard對我的工作很好,謝謝你的提示。但是,你有沒有繼承PromptDialog.Choice的例子? –

回答

1

正如我告訴你的意見,我相信你想實現什麼,一個HeroCardImBack按鈕類型將是剛剛夠。您可以查看cards-RichCards示例以瞭解有關不同類型卡片的更多信息。

關於如何通過繼承創建自定義PromptChoice,您可以檢查CancelablePromptChoice。基本上,您需要覆蓋TryParse並添加自定義邏輯,以傳遞您收到的任何響應或僅傳遞您想要的響應。在我鏈接的那個中,定製完成後接受條款退出PromptChoice

0

謝謝@ejadib我剛剛用一個HeroCard替換了PromptDialog.Choice,它符合我的要求就像一個魅力。

//This returns a new new HeroCard with some buttons inside of it 
var rootCard = GetCard(); 

var reply = context.MakeMessage(); 
reply.Attachments.Add(rootCard); 

await context.PostAsync(reply); 
context.Wait(MessageReceivedAsync); 

可如下RootDialog實現:

[Serializable] 
    public class RootDialog : IDialog<object> 
    { 
     //private static IEnumerable<string> options = new List<string> { GlobalResources.AboutToro, GlobalResources.Investiments, GlobalResources.IsThereAnyRisk, GlobalResources.ResourceDeposits, GlobalResources.Access_LoginAndPasswords, GlobalResources.AccountOpening }; 
     public async Task StartAsync(IDialogContext context) 
     { 
      context.Wait(MessageReceivedAsync); 
     } 

     private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> result) 
     { 
      var message = await result; 

      if (message.Text == null || message.Text.Equals(GlobalResources.Back, StringComparison.InvariantCultureIgnoreCase)) 
      { //Quando entra nesse diálogo a 1ª vez ou volta de um dialogo filho. 
       var rootCard = GetCard(); 

       var reply = context.MakeMessage(); 
       reply.Attachments.Add(rootCard); 

       await context.PostAsync(reply); 
       context.Wait(MessageReceivedAsync); 
      } 
      else if (message.Text.Equals(GlobalResources.AboutToro, StringComparison.InvariantCultureIgnoreCase)) 
      { 
       context.Call(new AboutToroDialog(), OnResumeToRootDialog); 
      } 
      else 
      { 
       var messageToForward = await result; 
       await context.Forward(new QnADialog(), AfterFAQDialog, messageToForward, CancellationToken.None); 
       return; 
      } 
     } 

     private async Task AfterFAQDialog(IDialogContext context, IAwaitable<object> result) 
     { 
      //var messageHandled = await result; 
      //if ((bool)messageHandled == true) 
      //{ 
      // await context.PostAsync("Sorry, I wasn't sure what you wanted."); 
      //} 

      context.Wait(MessageReceivedAsync); 
     } 

     private async Task OnResumeToRootDialog(IDialogContext context, IAwaitable<IMessageActivity> result) 
     { 
      await MessageReceivedAsync(context, result); 
     } 

     private Attachment GetCard() 
     { 
      var buttons = new List<CardAction> 
      { 
       new CardAction() 
       { 
        Title = GlobalResources.AboutToro, 
        Type = ActionTypes.ImBack, 
        Value = GlobalResources.AboutToro 
       }, 
       new CardAction() 
       { 
        Title = GlobalResources.IsThereAnyRisk, 
        Type = ActionTypes.ImBack, 
        Value = GlobalResources.IsThereAnyRisk 
       }, 
       new CardAction() 
       { 
        Title = GlobalResources.ResourceDeposits, 
        Type = ActionTypes.ImBack, 
        Value = GlobalResources.ResourceDeposits 
       }, 
       new CardAction() 
       { 
        Title = GlobalResources.Access_LoginAndPasswords, 
        Type = ActionTypes.ImBack, 
        Value = GlobalResources.Access_LoginAndPasswords 
       }, 
       new CardAction() 
       { 
        Title = GlobalResources.AccountOpening, 
        Type = ActionTypes.ImBack, 
        Value = GlobalResources.AccountOpening 
       }, 
      }; 

      var images = new List<CardImage> 
      { 
       new CardImage("http://is1.mzstatic.com/image/thumb/Purple117/v4/b8/d5/5e/b8d55e77-d70e-f22b-17b7-2498d974a4fe/source/175x175bb.jpg") 
      }; 

      return new HeroCard("Em que posso te ajudar ?", "subtitle", "bla bla bla",images, buttons).ToAttachment(); 
     } 

    } 
}