public static ITemplateAction ParseTemplateAction(dynamic dynamicObject)
        {
            var type = (TemplateActionType)System.Enum.Parse(typeof(TemplateActionType), (string)dynamicObject?.type, true);

            return(type switch
            {
                TemplateActionType.Message => MessageTemplateAction.CreateFrom(dynamicObject),
                TemplateActionType.Uri => UriTemplateAction.CreateFrom(dynamicObject),
                TemplateActionType.Postback => PostbackTemplateAction.CreateFrom(dynamicObject),
                TemplateActionType.Datetimepicker => DateTimePickerTemplateAction.CreateFrom(dynamicObject),
                TemplateActionType.Camera => CameraTemplateAction.CreateFrom(dynamicObject),
                TemplateActionType.CameraRoll => CameraRollTemplateAction.CreateFrom(dynamicObject),
                TemplateActionType.Location => LocationTemplateAction.CreateFrom(dynamicObject),
                _ => null,
            });
        public static ITemplateAction ParseTemplateAction(dynamic dynamicObject)
        {
            var type = (TemplateActionType)System.Enum.Parse(typeof(TemplateActionType), (string)dynamicObject?.type, true);

            switch (type)
            {
            case TemplateActionType.Message:
                return(MessageTemplateAction.CreateFrom(dynamicObject));

            case TemplateActionType.Uri:
                return(UriTemplateAction.CreateFrom(dynamicObject));

            case TemplateActionType.Postback:
                return(PostbackTemplateAction.CreateFrom(dynamicObject));

            case TemplateActionType.Datetimepicker:
                return(DateTimePickerTemplateAction.CreateFrom(dynamicObject));

            default:
                return(null);
            }
        }
        protected override async Task OnMessageAsync(MessageEvent ev)
        {
            var msg = ev.Message as TextEventMessage;

            if (msg == null)
            {
                return;
            }

            switch (msg.Text)
            {
            case "Rectangle-Cover":
                await ReplyCarouselTemplateMessageAsync(ev.ReplyToken, ImageAspectRatioType.Rectangle, ImageSizeType.Cover);

                break;

            case "Square-Contain":
                await ReplyCarouselTemplateMessageAsync(ev.ReplyToken, ImageAspectRatioType.Square, ImageSizeType.Contain);

                break;

            case "Square-Cover":
                await ReplyCarouselTemplateMessageAsync(ev.ReplyToken, ImageAspectRatioType.Square, ImageSizeType.Cover);

                break;

            case "Rectangle-Contein":
            default:
                await ReplyCarouselTemplateMessageAsync(ev.ReplyToken, ImageAspectRatioType.Rectangle, ImageSizeType.Contain);

                break;
            }

            async Task ReplyCarouselTemplateMessageAsync(string replyToken, ImageAspectRatioType imageAspectRatio, ImageSizeType imageSize)
            {
                var imageUri = BlobStorage.ListBlobUri(blobDirectoryName).FirstOrDefault(uri => uri.ToString().EndsWith(imageName));

                if (imageUri == null)
                {
                    imageUri = await BlobStorage.UploadImageAsync(Properties.Resources.sample_image, blobDirectoryName, imageName);
                }
                var defaultAction   = new MessageTemplateAction("Default-Action", "Default-Action");
                var templateMessage = new TemplateMessage("CarouselTemplate",
                                                          new CarouselTemplate(new[]
                {
                    new CarouselColumn(
                        imageAspectRatio + "-" + imageSize,
                        imageUri.ToString(),
                        "Test of thumbnail image settings",
                        new [] { new MessageTemplateAction("Rectangle-Contain", "Rectangle-Contain") },
                        "#FF0000",
                        defaultAction),
                    new CarouselColumn(
                        imageAspectRatio + "-" + imageSize,
                        imageUri.ToString(),
                        "Test of thumbnail image settings",
                        new [] { new MessageTemplateAction("Rectangle-Cover", "Rectangle-Cover") },
                        "#00FF00",
                        defaultAction),
                    new CarouselColumn(
                        imageAspectRatio + "-" + imageSize,
                        imageUri.ToString(),
                        "Test of thumbnail image settings",
                        new [] { new MessageTemplateAction("Square-Contain", "Square-Contain") },
                        "#0000FF",
                        defaultAction),
                    new CarouselColumn(
                        imageAspectRatio + "-" + imageSize,
                        imageUri.ToString(),
                        "Test of thumbnail image settings",
                        new [] { new MessageTemplateAction("Square-Cover", "Square-Cover") },
                        "#FF00FF",
                        defaultAction)
                },
                                                                               imageAspectRatio,
                                                                               imageSize));

                await MessagingClient.ReplyMessageAsync(replyToken, new[] { templateMessage });
            }
        }
        public (RichMenu newRichMenu, RenderTargetBitmap bitmap) RenderingRichMenu()
        {
            var body = this.FindName("menu_body") as UIElement;

            if (body == null)
            {
                return(null, null);
            }

            var areas = new List <ActionArea>();

            foreach (var area in Enumerable.Range(1, 20).Select(n => "area_" + n))
            {
                var areaObj = this.FindName(area) as UIElement;
                if (areaObj == null)
                {
                    continue;
                }

                var             menuAction = RichMenuProperties.GetAction(areaObj);
                ITemplateAction action     = null;
                switch (menuAction.Type)
                {
                case TemplateActionType.Message:
                    action = new MessageTemplateAction(menuAction.Label, menuAction.Text);
                    break;

                case TemplateActionType.Postback:
                    action = new PostbackTemplateAction(menuAction.Label, menuAction.Data, menuAction.Text);
                    break;

                case TemplateActionType.Uri:
                    action = new UriTemplateAction(menuAction.Label, menuAction.Uri);
                    break;

                case TemplateActionType.Datetimepicker:
                    action = new DateTimePickerTemplateAction(menuAction.Label, menuAction.Data, menuAction.DateTimeMode,
                                                              menuAction.initialDateTime, menuAction.minDateTime, menuAction.maxDateTime);
                    break;
                }
                if (action == null)
                {
                    continue;
                }
                ;

                var topLeft = areaObj.TransformToVisual(body).Transform(new Point(0, 0));
                areas.Add(new ActionArea()
                {
                    Bounds = new ImageArea(
                        (int)topLeft.X,
                        (int)topLeft.Y,
                        (int)areaObj.RenderSize.Width,
                        (int)areaObj.RenderSize.Height),
                    Action = action
                });
            }

            var details = RichMenuProperties.GetSettings(body);
            var menu    = new RichMenu()
            {
                Name        = details.Name,
                ChatBarText = details.ChatBarText,
                Selected    = details.Selected,
                Size        = new ImageSize((int)body.RenderSize.Width, (int)body.RenderSize.Height),
                Areas       = areas
            };

            var bmp = new RenderTargetBitmap(menu.Size.Width, menu.Size.Height, 96, 96, PixelFormats.Pbgra32);

            bmp.Render(body);

            return(menu, bmp);
        }