Exemple #1
0
        public async Task ActionRendererRegistraton_DefaultActionsPresent()
        {
            var dispatcher = CoreApplication.MainView.CoreWindow.Dispatcher;

            // Need to move the test to the UI Thread
            Exception dispatcherException = null;
            await dispatcher.RunAsync(CoreDispatcherPriority.Normal, async() =>
            {
                try
                {
                    AdaptiveCardRenderer renderer = new AdaptiveCardRenderer();

                    Assert.IsNotNull(renderer.ActionRenderers.Get("Action.OpenUrl"));
                    Assert.IsNotNull(renderer.ActionRenderers.Get("Action.ShowCard"));
                    Assert.IsNotNull(renderer.ActionRenderers.Get("Action.Submit"));
                    Assert.IsNotNull(renderer.ActionRenderers.Get("Action.ToggleVisibility"));
                }
                catch (Exception e)
                {
                    // If we throw an exception from inside the dispatcher the test infrastructure loses its
                    // connection with the tests. Hold onto this and throw it from the main test thread so
                    // it is reported properly as a test failure.
                    dispatcherException = e;
                }
            });

            if (dispatcherException != null)
            {
                // Rethrow any exceptions that may have happened within the dispatcher
                throw dispatcherException;
            }
        }
        private async void OnRenderAdaptiveCard(object sender, RoutedEventArgs e)
        {
            AdaptiveCardRenderer renderer = new AdaptiveCardRenderer();

            //string result = System.Reflection.Assembly.GetExecutingAssembly().Location;
            //int index = result.LastIndexOf("\\");
            //string jsonPath = $"{result.Substring(0, index)}\\adaptivecard.json";
            //TextReader tr = new StreamReader(jsonPath);
            //string json = await tr.ReadToEndAsync();

            HttpClient client = new HttpClient();

            json = await client.GetStringAsync("https://adaptivecard.azurewebsites.net/api/AppConsultAdaptiveCards?code=AzSEpdNE/P0c9OFIBjro2vSKwGIlLdBWdc53/jmR7Y9PX2l1Ks0/nQ==");

            AdaptiveCardParseResult card = AdaptiveCard.FromJson(json);

            var renderResult = renderer.RenderCard(card.Card);

            renderResult.OnAction += RenderResult_OnAction;

            if (renderResult != null)
            {
                MainPanel.Children.Add(renderResult.FrameworkElement);
            }
        }
Exemple #3
0
        protected override void OnElementChanged(ElementChangedEventArgs <AdaptiveCardLayout> e)
        {
            var renderer    = new AdaptiveCardRenderer();
            var activity    = e.NewElement.BindingContext as Bot.Connector.DirectLine.Activity;
            var oldActivity = e.OldElement?.BindingContext as Bot.Connector.DirectLine.Activity;

            if (!string.Equals(oldActivity?.Id, activity?.Id))
            {
                if (activity.Attachments != null &&
                    activity.Attachments.Any(m => m.ContentType == "application/vnd.microsoft.card.adaptive"))
                {
                    var cardAttachments = activity.Attachments.Where(m => m.ContentType == "application/vnd.microsoft.card.adaptive");

                    foreach (var attachment in cardAttachments)
                    {
                        var          jObject = (JObject)attachment.Content;
                        AdaptiveCard card    = null;
                        try
                        {
                            card = jObject.ToObject <AdaptiveCard>();
                        }
                        catch (Exception ex)
                        {
                            // GETTING Deserializing error here
                            //      Message	"Error converting value \"number\" to type 'AdaptiveCards.TextInputStyle'. Path 'style'."	string
                        }

                        Device.BeginInvokeOnMainThread(() =>
                        {
                            if (!e.NewElement.Children.Any())
                            {
                                var xaml = renderer.RenderCard(card);
                                // RecurseForButtons(xaml.View);

                                if (xaml.View != null)
                                {
                                    xaml.OnAction += (s, args) => e.NewElement.InvokeOnAction(s, args);

                                    xaml.View.WidthRequest    = 350;
                                    xaml.View.Margin          = new Thickness(8);
                                    xaml.View.BackgroundColor = Color.LightGray;

                                    e.NewElement.Children.Add(xaml.View);

                                    MessagingCenter.Send(this, "ScrollToBottom");
                                }
                                else
                                {
                                    e.NewElement.Children.Add(new Label()
                                    {
                                        Text = activity.Summary
                                    });
                                }
                            }
                        });
                    }
                }
                base.OnElementChanged(e);
            }
        }
Exemple #4
0
 public static void UseXceedElementRenderers(this AdaptiveCardRenderer renderer)
 {
     renderer.ElementRenderers.Set <AdaptiveTextInput>(XceedTextInput.Render);
     renderer.ElementRenderers.Set <AdaptiveCards.AdaptiveNumberInput>(XceedNumberInput.Render);
     renderer.ElementRenderers.Set <AdaptiveDateInput>(XceedDateInput.Render);
     renderer.ElementRenderers.Set <AdaptiveTimeInput>(XceedTimeInput.Render);
 }
Exemple #5
0
 public static void UseDefaultElementRenderers(this AdaptiveCardRenderer renderer)
 {
     renderer.ElementRenderers.Set <AdaptiveTextInput>(AdaptiveTextInputRenderer.Render);
     renderer.ElementRenderers.Set <AdaptiveNumberInput>(AdaptiveNumberInputRenderer.Render);
     renderer.ElementRenderers.Set <AdaptiveDateInput>(AdaptiveDateInputRenderer.Render);
     renderer.ElementRenderers.Set <AdaptiveTimeInput>(AdaptiveTimeInputRenderer.Render);
 }
        public MainPage()
        {
            this.InitializeComponent();

            // Create a card renderer.
            _cardRendrer = new AdaptiveCardRenderer();

            // Set several attributes on the renderer, including the font family and sizes.
            var hostConfig = new AdaptiveHostConfig
            {
                FontFamily = "Calibri",
                FontSizes  =
                {
                    Default    = 20,
                    Small      = 15,
                    Medium     = 25,
                    Large      = 30,
                    ExtraLarge = 40,
                }
            };

            // Set the host config properties on the renderer.
            _cardRendrer.HostConfig = hostConfig;

            // Create the main card.
            CreateMainCard();

            // Rendering the card enables the actions.
            RenderCard(_mainCard);
        }
        public static void InitializeRenderer(AdaptiveHostConfig hostConfig)
        {
            _renderer = new AdaptiveCardRenderer();
            if (hostConfig != null)
            {
                _renderer.HostConfig = hostConfig;
            }

            // Add a feature representing this version of the visualizer. used for test cards.
            _renderer.FeatureRegistration.Set("acTest", "1.0");

            if (Settings.UseFixedDimensions)
            {
                _renderer.SetFixedDimensions(320, 180);
            }

            // Custom resource resolvers
            _renderer.ResourceResolvers.Set("symbol", new MySymbolResourceResolver());

            /*
             * Example on how to override the Action Positive and Destructive styles
             * Style positiveStyle = new Style(typeof(Button));
             * positiveStyle.Setters.Add(new Setter(Button.BackgroundProperty, new SolidColorBrush(Windows.UI.Colors.LawnGreen)));
             * Style destructiveStyle = new Style(typeof(Button));
             * destructiveStyle.Setters.Add(new Setter(Button.BackgroundProperty, new SolidColorBrush(Windows.UI.Colors.Red)));
             * Style otherStyle = new Style(typeof(Button));
             * otherStyle.Setters.Add(new Setter(Button.BackgroundProperty, new SolidColorBrush(Windows.UI.Colors.Yellow)));
             * otherStyle.Setters.Add(new Setter(Button.ForegroundProperty, new SolidColorBrush(Windows.UI.Colors.DarkRed)));
             *
             * _renderer.OverrideStyles = new ResourceDictionary();
             * _renderer.OverrideStyles.Add("Adaptive.Action.Positive", positiveStyle);
             * _renderer.OverrideStyles.Add("Adaptive.Action.Destructive", destructiveStyle);
             * _renderer.OverrideStyles.Add("Adaptive.Action.other", otherStyle);
             */
        }
        public MainWindow()
        {
            InitializeComponent();
            if (Dispatcher != null)
            {
                Dispatcher.UnhandledException += Dispatcher_UnhandledException;
            }
            CommandBinding cb = new CommandBinding(ApplicationCommands.Copy, this.CopyCmdExecuted, this.CopyCmdCanExecute);

            this.ConversationView.ConversationHistory.CommandBindings.Add(cb);
            this.ActivitiesPane.CommandBindings.Add(cb);
            this.ActivityPayloadPane.CommandBindings.Add(cb);
            this.DataContext             = this;
            this.player.PlaybackStopped += this.Player_PlaybackStopped;
            Services.Tracker.Track(settings);
            Services.Tracker.Track(this);

            this.renderer = new AdaptiveCardRenderer();
            this.renderer.UseXceedElementRenderers();
            var configFile = Path.Combine(System.Reflection.Assembly.GetExecutingAssembly().Location, "AdaptiveCardsHostConfig.json");

            if (File.Exists(configFile))
            {
                this.renderer.HostConfig = AdaptiveHostConfig.FromJson(File.ReadAllText(configFile));
            }
        }
        public MainView()
        {
            DataContextChanged += MainView_DataContextChanged;

            InitializeComponent();

            string json;

            try
            {
                var fileHelper = IoC.Get <IFileHelper>();
                json = fileHelper.ReadTextFile(fileHelper.ActualPath + "Assets/WindowsNotificationHostConfig.json");
            }
            catch
            {
                json = null;
            }

            if (json == null)
            {
                _renderer = new AdaptiveCardRenderer();
            }
            else
            {
                var hostConfig = AdaptiveHostConfig.FromJson(json);
                _renderer = new AdaptiveCardRenderer(hostConfig);
            }

            _card = CreateCard();
        }
Exemple #10
0
        public async Task RenderInDispatcher(AdaptiveCard card)
        {
            RenderedAdaptiveCard renderedCard = null;

            // Need to move the test to the UI Thread to render the card
            var       dispatcher          = CoreApplication.MainView.CoreWindow.Dispatcher;
            Exception dispatcherException = null;
            await dispatcher.RunAsync(CoreDispatcherPriority.Normal, async() =>
            {
                try
                {
                    var renderer = new AdaptiveCardRenderer();

                    renderedCard = renderer.RenderAdaptiveCard(card);
                }
                catch (Exception e)
                {
                    // If we throw an exception from inside the dispatcher the test infrastructure loses its
                    // connection with the tests. Hold onto this and throw it from the main test thread so
                    // it is reported properly as a test failure.
                    dispatcherException = e;
                }
            });

            if (dispatcherException != null)
            {
                // Rethrow any exceptions that may have happened within the dispatcher
                throw dispatcherException;
            }

            Assert.AreEqual(0, renderedCard.Warnings.Count);
            Assert.AreEqual(0, renderedCard.Errors.Count);
        }
Exemple #11
0
        public void TextBlocks_Markdown()
        {
            var card = new AdaptiveCard("1.2")
            {
                Body = new System.Collections.Generic.List <AdaptiveElement>()
                {
                    new AdaptiveRichTextBlock()
                    {
                        Inlines =
                        {
                            new AdaptiveTextRun
                            {
                                Text = "The RichTextBlock should not support **markdown**"
                            }
                        }
                    },
                    new AdaptiveTextBlock()
                    {
                        Text = "The TextBlock should support **markdown**"
                    }
                }
            };

            var renderer      = new AdaptiveCardRenderer();
            var result        = renderer.RenderCard(card);
            var generatedHtml = result.Html.ToString();

            Assert.AreEqual(
                "<div class='ac-adaptivecard' style='width: 100%;background-color: rgba(255, 255, 255, 1.00);padding: 15px;box-sizing: border-box;justify-content: flex-start;'><div class='ac-richtextblock' style='box-sizing: border-box;text-align: left;word-wrap: break-word;'><p style='margin-top: 0px;margin-bottom: 0px;width: 100%;'><span class='ac-textrun' style='color: rgba(0, 0, 0, 1.00);line-height: 18.62px;font-size: 14px;font-weight: 400;'>The RichTextBlock should not support **markdown**</span></p></div><div class='ac-separator' style='height: 8px;'></div><div class='ac-textblock' style='box-sizing: border-box;text-align: left;color: rgba(0, 0, 0, 1.00);line-height: 18.62px;font-size: 14px;font-weight: 400;white-space: nowrap;'><p style='margin-top: 0px;margin-bottom: 0px;width: 100%;text-overflow: ellipsis;overflow: hidden;'>The TextBlock should support <strong>markdown</strong></p></div></div>",
                generatedHtml);
        }
        protected override void Render()
        {
            if (CardJson == null)
            {
                CardFrameworkElement = null;
                return;
            }

            try
            {
                var renderer = new AdaptiveCardRenderer();

                if (HOST_CONFIG_JSON != null)
                {
                    var hostParseResult = AdaptiveHostConfig.FromJsonString(HOST_CONFIG_JSON);
                    if (hostParseResult.HostConfig != null)
                    {
                        renderer.HostConfig = hostParseResult.HostConfig;
                    }
                }

                var renderedCard = renderer.RenderAdaptiveCardFromJsonString(CardJson);
                CardFrameworkElement = renderedCard.FrameworkElement;
            }
            catch { }
        }
        public async Task <ActionResult> Details(string announcementid)
        {
            AdaptiveCardRenderer renderer = new AdaptiveCardRenderer();

            if (string.IsNullOrEmpty(announcementid))
            {
                return(HttpNotFound());
            }

            var announcement = await Cache.Announcements.GetItemAsync(announcementid);

            AnnouncementDetails announcementinfo = new AnnouncementDetails();

            if (announcement != null)
            {
                announcement.ShowAllDetailsButton = false;
                var html = announcement.GetPreviewCard();
                announcement.ShowAllDetailsButton = true;
                RenderedAdaptiveCard renderedCard = renderer.RenderCard(html);
                HtmlTag cardhtml = renderedCard.Html;

                announcementinfo.Title = announcement.Title;
                announcementinfo.html  = cardhtml;
            }
            return(View(announcementinfo));
        }
        public static void Create(AdaptiveOpenUrlAction action, HtmlTag tag, AdaptiveRenderContext renderContext)
        {
            tag.Attr("id", AdaptiveCardRenderer.GenerateRandomId());
            tag.Attr("data-ac-url", action.Url);

            tag.Attributes.Add("onclick", "window.blazorAdaptiveCards.openUrl(this.getAttribute('data-ac-url'), this)");
        }
Exemple #15
0
        public static void InitializeRenderer(AdaptiveHostConfig hostConfig)
        {
            try
            {
                _renderer = new AdaptiveCardRenderer();
                if (hostConfig != null)
                {
                    _renderer.HostConfig = hostConfig;
                }

                if (Settings.UseFixedDimensions)
                {
                    _renderer.SetFixedDimensions(320, 180);
                }

                // Custom resource resolvers
                _renderer.ResourceResolvers.Set("symbol", new MySymbolResourceResolver());
            }
            catch
            {
                if (Debugger.IsAttached)
                {
                    Debugger.Break();
                }
                throw;
            }
        }
        public MainWindow()
        {
            this.InitializeComponent();
            this.Dispatcher.UnhandledException += this.Dispatcher_UnhandledException;
            CommandBinding cb = new CommandBinding(ApplicationCommands.Copy, this.CopyCmdExecuted, this.CopyCmdCanExecute);

            this.ConversationView.ConversationHistory.CommandBindings.Add(cb);
            this.ActivitiesPane.CommandBindings.Add(cb);
            this.ActivityPayloadPane.CommandBindings.Add(cb);
            this.DataContext             = this;
            this.player.PlaybackStopped += this.Player_PlaybackStopped;
            Services.Tracker.Configure(this.settings).Apply();

            this.renderer = new AdaptiveCardRenderer();

            /*
             * Xceed Enhanced Input Package
             * This optional package enhances the Adaptive Card input controls beyond what WPF provides out of the box.
             * To enable it:
             * 1. Add the NuGet package Extended.Wpf.Toolkit by Xceed to the project
             * 2. Add the NuGet package AdaptiveCards.Rendering.Wpf.Xceed by Microsoft to the project
             * 3. Uncomment the one line below
             * This option is not included here because of its license terms.
             * For more info: https://docs.microsoft.com/en-us/adaptive-cards/sdk/rendering-cards/net-wpf/getting-started
             */
            // this.renderer.UseXceedElementRenderers();

            var configFile = Path.Combine(System.Reflection.Assembly.GetExecutingAssembly().Location, "AdaptiveCardsHostConfig.json");

            if (File.Exists(configFile))
            {
                this.renderer.HostConfig = AdaptiveHostConfig.FromJson(File.ReadAllText(configFile));
            }
        }
        public void RenderFallbackItem()
        {
            var json = @"{
  ""type"": ""AdaptiveCard"",
  ""version"": ""1.2"",
  ""body"": [
    {
      ""type"": ""Graph"",
      ""text"": ""First textblock"",
      ""fallback"": {
        ""type"": ""TextBlock"",
        ""text"": ""Fallback textblock""
      }
    }
  ]
}";

            var card = AdaptiveCard.FromJson(json).Card;

            var renderer      = new AdaptiveCardRenderer();
            var result        = renderer.RenderCard(card);
            var generatedHtml = result.Html.ToString();

            Assert.AreEqual("<div class='ac-adaptivecard' style='width: 100%;background-color: rgba(255, 255, 255, 1.00);padding: 15px;box-sizing: border-box;justify-content: flex-start;'><div class='ac-textblock' style='box-sizing: border-box;text-align: left;color: rgba(0, 0, 0, 1.00);line-height: 18.62px;font-size: 14px;font-weight: 400;white-space: nowrap;'><p style='margin-top: 0px;margin-bottom: 0px;width: 100%;text-overflow: ellipsis;overflow: hidden;'>Fallback textblock</p></div></div>", generatedHtml);
        }
Exemple #18
0
        public static AdaptiveCardRenderer Create()
        {
            var renderer = new AdaptiveCardRenderer();

            renderer.ElementRenderers.Set("ActionSet", new AdaptiveActionSetRenderer(renderer));
            renderer.ElementRenderers.Set("Input.Text", new AdaptiveTextInputRenderer(renderer.ElementRenderers.Get("Input.Text")));
            return(renderer);
        }
        public async Task ActionRendererRegistraton_CustomActionTest()
        {
            var dispatcher = CoreApplication.MainView.CoreWindow.Dispatcher;

            // Need to move the test to the UI Thread
            await dispatcher.RunAsync(CoreDispatcherPriority.Normal, async() =>
            {
                AdaptiveActionParserRegistration actionParserRegistration = new AdaptiveActionParserRegistration();
                List <AdaptiveWarning> warnings = new List <AdaptiveWarning>();

                actionParserRegistration.Set("TestCustomAction", new TestActionParser());

                String testCard =
                    "{" +
                    "   \"type\":\"AdaptiveCard\"," +
                    "   \"version\":\"1.0\"," +
                    "   \"body\":" +
                    "   [" +
                    "   ]," +
                    "   \"actions\":" +
                    "   [" +
                    "       {" +
                    "           \"type\":\"TestCustomAction\"" +
                    "       }," +
                    "       {" +
                    "           \"type\":\"Action.Submit\"" +
                    "       }" +
                    "   ]" +
                    "}";

                AdaptiveCard card = AdaptiveCard.FromJsonString(testCard, null, actionParserRegistration).AdaptiveCard;
                Assert.IsNotNull(card);

                AdaptiveCardRenderer renderer = new AdaptiveCardRenderer();

                renderer.ActionRenderers.Set("TestCustomAction", new TestCustomActionRenderer());
                renderer.ActionRenderers.Set("Action.Submit", new TestSubmitActionRenderer());

                Assert.IsNotNull(renderer.ActionRenderers.Get("TestCustomAction") as TestCustomActionRenderer);
                Assert.IsNotNull(renderer.ActionRenderers.Get("Action.Submit") as TestSubmitActionRenderer);

                FrameworkElement renderedCard = renderer.RenderAdaptiveCard(card).FrameworkElement;

                bool submitFound = false;
                bool customFound = false;
                foreach (var radioButton in RenderTestHelpers.GetAllDescendants(renderedCard).OfType <RadioButton>())
                {
                    customFound |= radioButton.Name == "CustomActionRadioButton";
                    submitFound |= radioButton.Name == "SubmitActionRadioButton";
                }

                Assert.IsTrue(customFound && submitFound);

                renderer.ActionRenderers.Remove("TestCustomAction");
                renderer.ActionRenderers.Remove("Action.Submit");
                renderer.ActionRenderers.Remove("TestCustomActionThatDoesntExist");
            });
        }
        public async Task <ActionResult> Index(string cardUrl = null)
        {
            cardUrl = cardUrl ??
                      "https://raw.githubusercontent.com/Microsoft/AdaptiveCards/master/samples/v1.0/Scenarios/ActivityUpdate.json";

            try
            {
                var cts = new CancellationTokenSource(TimeSpan.FromSeconds(30));

                // Get the JSON from the card URL
                var client   = new HttpClient();
                var response = await client.GetAsync(cardUrl, cts.Token);

                var json = await response.Content.ReadAsStringAsync();

                // Make sure the payload has a version property
                var jObject = JObject.Parse(json);
                if (!jObject.TryGetValue("version", out var _))
                {
                    jObject["version"] = "0.5";
                }

                // Parse the Adaptive Card JSON
                AdaptiveCardParseResult parseResult = AdaptiveCard.FromJson(jObject.ToString());
                AdaptiveCard            card        = parseResult.Card;

                // Create a host config
                AdaptiveHostConfig hostConfig = new AdaptiveHostConfig()
                {
                    SupportsInteractivity = false
                };

                // TODO: Load custom host configs

                // Create a renderer
                AdaptiveCardRenderer renderer = new AdaptiveCardRenderer(hostConfig);

                // Set any XAML resource Dictionary if you have one
                renderer.ResourcesPath = System.IO.Path.Combine(_env.WebRootPath, "Styles", "MyStyles.xaml");

                // Render the card to bitmap
                RenderedAdaptiveCardImage renderedCard =
                    await renderer.RenderCardToImageAsync(card, createStaThread : true, cancellationToken : cts.Token);

                return(File(renderedCard.ImageStream, "image/png"));
            }
            catch (OperationCanceledException)
            {
                // Timed out
                return(StatusCode((int)HttpStatusCode.RequestTimeout));
            }
            catch (Exception)
            {
                // TODO: log
                throw;
            }
        }
Exemple #21
0
 private void Update()
 {
     try
     {
         var renderer = new AdaptiveCardRenderer(AdaptiveHostConfig.FromJson(HostConfigs.CortanaHostConfig));
         CardContainer.Child = renderer.RenderCard(AdaptiveCard.FromJson(TextBoxCard.Text).Card).FrameworkElement;
     }
     catch { }
 }
        public ShowCardWindow(string title, AdaptiveShowCardAction showCardAction)
        {
            InitializeComponent();
            var renderer     = new AdaptiveCardRenderer();
            var renderedCard = renderer.RenderCard(showCardAction.Card);

            this.rootGrid.Children.Clear();
            this.rootGrid.Children.Add(renderedCard.FrameworkElement);
        }
        public MainView()
        {
            DataContextChanged += MainView_DataContextChanged;

            InitializeComponent();

            _renderer = new AdaptiveCardRenderer();
            _card     = CreateCard();
        }
        private void RenderAdaptiveCard(string cardJson, TimeSpan mediaPlayedPosition, string mediaUrl)
        {
            IsHitTestVisible = false;

            // Create a new adaptive card renderer.
            var renderer = new AdaptiveCardRenderer();

            // Customize the font sizes via AdaptiveHostConfig.
            var hostConfig = new AdaptiveHostConfig
            {
                FontFamily = "Tw Cen MT",
                FontSizes  =
                {
                    Small      = 14,
                    Default    = 16,
                    Medium     = 16,
                    Large      = 20,
                    ExtraLarge = 24
                }
            };

            renderer.HostConfig = hostConfig;

            // Get card from json.
            var card = renderer.RenderAdaptiveCardFromJsonString(cardJson);

            // Attach the card content to UI.
            if (card.FrameworkElement is FrameworkElement element)
            {
                element.Loaded += (s, e) =>
                {
                    SetupExpressionAnimationsForCard();

                    var mediaElement = element.Children().OfType <MediaElement>().Single();

                    // TODO: Why mediaElement.Source is null here?? How do we
                    // auto-play without hacking??
                    // If the following works, we don't have to pass in the mediaUrl
                    // at all! Let me know if you know a better workaround. :)
                    //mediaElement.Position = mediaPlayedPosition;
                    //mediaElement.Play();

                    mediaElement.Source       = new Uri(mediaUrl);
                    mediaElement.MediaOpened += (o, a) =>
                    {
                        mediaElement.Position = mediaPlayedPosition;
                        //mediaElement.Play(); // This doesn't work...
                    };

                    // Now the UI is ready.
                    IsHitTestVisible = true;
                };

                MediaContainer.Child = element;
                Card.Visibility      = Visibility.Visible;
            }
        }
 public void Initialize(JObject item, AdaptiveCardRenderer renderer)
 {
     Renderer = renderer;
     Id       = item.Value <string>("id");
     foreach (var prop in item.Value <JObject>("props"))
     {
         ApplyPropertyChange(prop.Key, prop.Value);
     }
 }
        public void ContainerStyleForegroundColors()
        {
            var hostConfig = new AdaptiveHostConfig();

            hostConfig.ContainerStyles.Emphasis.ForegroundColors = new ForegroundColorsConfig()
            {
                Default = new FontColorConfig("#FFcc3300")
            };

            var card = new AdaptiveCard("1.2")
            {
                Body = new System.Collections.Generic.List <AdaptiveElement>()
                {
                    new AdaptiveContainer()
                    {
                        Style = AdaptiveContainerStyle.Emphasis,
                        Items = new System.Collections.Generic.List <AdaptiveElement>()
                        {
                            new AdaptiveTextBlock()
                            {
                                Text = "container 1 -- emphasis style text"
                            },
                            new AdaptiveContainer()
                            {
                                Style = AdaptiveContainerStyle.Accent,
                                Items = new System.Collections.Generic.List <AdaptiveElement>()
                                {
                                    new AdaptiveTextBlock()
                                    {
                                        Text = "container 1.1 -- accent style text"
                                    }
                                }
                            },
                            new AdaptiveTextBlock()
                            {
                                Text = "container 1 -- emphasis style text"
                            }
                        }
                    },
                    new AdaptiveTextBlock()
                    {
                        Text = "default style text"
                    }
                }
            };

            var renderer      = new AdaptiveCardRenderer(hostConfig);
            var result        = renderer.RenderCard(card);
            var generatedHtml = result.Html.ToString();

            var randomGeneratedIds = FindAllRandomGeneratedIds(generatedHtml);

            Assert.AreEqual(
                "<div class='ac-adaptivecard' style='width: 100%;background-color: rgba(255, 255, 255, 1.00);padding: 15px;box-sizing: border-box;justify-content: flex-start;'><div class='ac-container' style='padding-right: 15px;padding-left: 15px;padding-top: 15px;padding-bottom: 15px;background-color: rgba(0, 0, 0, 0.03);justify-content: flex-start;'><div class='ac-textblock' style='box-sizing: border-box;text-align: left;color: rgba(204, 51, 0, 1.00);line-height: 18.62px;font-size: 14px;font-weight: 400;white-space: nowrap;'><p style='margin-top: 0px;margin-bottom: 0px;width: 100%;text-overflow: ellipsis;overflow: hidden;'>container 1 -- emphasis style text</p></div><div class='ac-separator' id='" + randomGeneratedIds[0] + "' style='height: 8px;'></div><div class='ac-container' data-ac-separatorId='" + randomGeneratedIds[0] + "' style='padding-right: 15px;padding-left: 15px;padding-top: 15px;padding-bottom: 15px;background-color: #dce5f7;justify-content: flex-start;'><div class='ac-textblock' style='box-sizing: border-box;text-align: left;color: rgba(0, 0, 0, 1.00);line-height: 18.62px;font-size: 14px;font-weight: 400;white-space: nowrap;'><p style='margin-top: 0px;margin-bottom: 0px;width: 100%;text-overflow: ellipsis;overflow: hidden;'>container 1.1 -- accent style text</p></div></div><div class='ac-separator' id='" + randomGeneratedIds[1] + "' style='height: 8px;'></div><div class='ac-textblock' data-ac-separatorId='" + randomGeneratedIds[1] + "' style='box-sizing: border-box;text-align: left;color: rgba(204, 51, 0, 1.00);line-height: 18.62px;font-size: 14px;font-weight: 400;white-space: nowrap;'><p style='margin-top: 0px;margin-bottom: 0px;width: 100%;text-overflow: ellipsis;overflow: hidden;'>container 1 -- emphasis style text</p></div></div><div class='ac-separator' id='" + randomGeneratedIds[2] + "' style='height: 8px;'></div><div class='ac-textblock' data-ac-separatorId='" + randomGeneratedIds[2] + "' style='box-sizing: border-box;text-align: left;color: rgba(0, 0, 0, 1.00);line-height: 18.62px;font-size: 14px;font-weight: 400;white-space: nowrap;'><p style='margin-top: 0px;margin-bottom: 0px;width: 100%;text-overflow: ellipsis;overflow: hidden;'>default style text</p></div></div>",
                generatedHtml);
        }
        /// <summary>
        /// Create WeChat news instance from the given adaptive card.
        /// </summary>
        /// <param name="activity">Message activity received from bot.</param>
        /// <param name="adaptiveCard">Adaptive card instance.</param>
        /// <param name="title">Title or name of the card attachment.</param>
        /// <returns>A <seealso cref="News"/> converted from adaptive card.</returns>
        private async Task <News> CreateNewsFromAdaptiveCard(IMessageActivity activity, AdaptiveCard adaptiveCard, string title)
        {
            try
            {
                if (!adaptiveCard.AdditionalProperties.ContainsKey(CoverImageUrlKey))
                {
                    throw new ArgumentException("Cover image is required.", nameof(adaptiveCard));
                }

                if (!adaptiveCard.AdditionalProperties.ContainsKey(ContentSourceUrlKey))
                {
                    throw new ArgumentException("Content source URL is required.", nameof(adaptiveCard));
                }

                var renderer       = new AdaptiveCardRenderer();
                var schemaVersion  = renderer.SupportedSchemaVersion;
                var converImageUrl = adaptiveCard.AdditionalProperties[CoverImageUrlKey].ToString();
                var attachmentData = await CreateAttachmentDataAsync(title ?? activity.Text, converImageUrl, MediaTypes.Image).ConfigureAwait(false);

                var thumbMediaId = (await _wechatClient.UploadMediaAsync(attachmentData, false).ConfigureAwait(false)).MediaId;

                // Replace all image URL to WeChat acceptable URL
                foreach (var element in adaptiveCard.Body)
                {
                    await ReplaceAdaptiveImageUri(element).ConfigureAwait(false);
                }

                // Render the card
                var renderedCard = renderer.RenderCard(adaptiveCard);
                var html         = renderedCard.Html;

                // (Optional) Check for any renderer warnings
                // This includes things like an unknown element type found in the card
                // Or the card exceeded the maximum number of supported actions, etc
                var warnings = renderedCard.Warnings;
                var news     = new News
                {
                    Author      = activity.From.Name,
                    Description = adaptiveCard.Speak ?? adaptiveCard.FallbackText,
                    Content     = html.ToString(),
                    Title       = title,

                    // Set not should cover, because adaptive card don't have a cover.
                    ShowCoverPicture = "0",
                    ContentSourceUrl = adaptiveCard.AdditionalProperties[ContentSourceUrlKey].ToString(),
                    ThumbMediaId     = thumbMediaId,
                };

                return(news);
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "Process adaptive card failed.");
                throw;
            }
        }
Exemple #28
0
        static async Task RenderImage(AdaptiveCard card, string image)
        {
            var renderer    = new AdaptiveCardRenderer();
            var imageStream = await renderer.RenderToImageAsync(card);

            using (FileStream fileStream = new FileStream(image, FileMode.Create))
            {
                await imageStream.CopyToAsync(fileStream);
            }
        }
        private void OnShowCard(object sender, RoutedEventArgs e)
        {
            void ShowSubmitAction(RenderedAdaptiveCard card, AdaptiveSubmitAction action)
            {
                var inputs = card.UserInputs.AsJson();

                inputs.Merge(action.Data);
                MessageBox.Show(JsonConvert.SerializeObject(inputs, Formatting.Indented));
            }

            void ShowCardAction(RenderedAdaptiveCard card, AdaptiveShowCardAction action)
            {
                if (_hostConfig.Actions.ShowCard.ActionMode == ShowCardActionMode.Popup)
                {
                    var dialog = new ShowCardWindow("Show Card", action);
                    dialog.Owner = this;
                    dialog.ShowDialog();
                }
            }

            void OpenUrlAction(RenderedAdaptiveCard card, AdaptiveOpenUrlAction action)
            {
                webBrowser.Navigate(action.Url.ToString());
            }

            AdaptiveCardRenderer renderer = new AdaptiveCardRenderer(_hostConfig);
            var version = renderer.SupportedSchemaVersion;
            // renderer.UseXceedElementRenderers();

            var result       = AdaptiveCard.FromJson(LoadJson());
            var renderedCard = renderer.RenderCard(result.Card);

            renderedCard.OnAction += (RenderedAdaptiveCard card, AdaptiveActionEventArgs args) =>
            {
                switch (args.Action)
                {
                case AdaptiveSubmitAction submitAction:
                    ShowSubmitAction(card, submitAction);
                    break;

                case AdaptiveShowCardAction showCardAction:
                    ShowCardAction(card, showCardAction);
                    break;

                case AdaptiveOpenUrlAction openUrlAction:
                    OpenUrlAction(card, openUrlAction);
                    break;

                default:
                    break;
                }
            };
            grid1.Children.Clear();
            grid1.Children.Add(renderedCard.FrameworkElement);
        }
Exemple #30
0
        public MainWindow()
        {
            foreach (var type in typeof(AdaptiveHostConfig).Assembly.GetExportedTypes()
                     .Where(t => t.Namespace == typeof(AdaptiveHostConfig).Namespace))
            {
                TypeDescriptor.AddAttributes(type, new ExpandableObjectAttribute());
            }

            InitializeComponent();

            _synth = new SpeechSynthesizer();
            _synth.SelectVoiceByHints(VoiceGender.Female, VoiceAge.Adult);
            _synth.SetOutputToDefaultAudioDevice();
            var timer = new DispatcherTimer {
                Interval = TimeSpan.FromSeconds(1)
            };

            timer.Tick += Timer_Tick;
            timer.Start();

            foreach (var config in Directory.GetFiles(@"HostConfig", "*.json"))
            {
                hostConfigs.Items.Add(new ComboBoxItem
                {
                    Content = Path.GetFileNameWithoutExtension(config),
                    Tag     = config
                });
            }

            foreach (var samples in Directory.GetFiles(@"Samples", "*.json"))
            {
                Samples.Add(Path.GetFileNameWithoutExtension(samples));
            }
            listBoxSamples.ItemsSource = Samples;


            Renderer = new AdaptiveCardRenderer()
            {
                Resources = Resources
            };

            // Use the Xceed rich input controls
            Renderer.UseXceedElementRenderers();

            // Register custom elements and actions
            // TODO: Change to instance property? Change to UWP parser registration
            AdaptiveTypedElementConverter.RegisterTypedElement <MyCustomRating>();
            AdaptiveTypedElementConverter.RegisterTypedElement <MyCustomAction>();

            Renderer.ElementRenderers.Set <MyCustomRating>(MyCustomRating.Render);

            // This seems unecessary?
            Renderer.ActionHandlers.AddSupportedAction <MyCustomAction>();
            CardType.ItemsSource = new string[] { "Hero", "Regular", "DetailCard" };
        }