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); } }
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); } }
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); }
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(); }
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); }
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)"); }
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); }
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; } }
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; } }
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); }
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" }; }