private static void AddInlineTextRun(TextBlock uiRichTB, AdaptiveTextRun textRun, AdaptiveRenderContext context) { Span textRunSpan; if (textRun.SelectAction != null && context.Config.SupportsInteractivity) { Hyperlink selectActionLink = new Hyperlink(); selectActionLink.Click += (sender, e) => { context.InvokeAction(uiRichTB, new AdaptiveActionEventArgs(textRun.SelectAction)); e.Handled = true; }; textRunSpan = selectActionLink as Span; } else { textRunSpan = new Span(); } // Handle Date/Time parsing string text = RendererUtilities.ApplyTextFunctions(textRun.Text, context.Lang); textRunSpan.Inlines.Add(text); textRunSpan.Style = context.GetStyle($"Adaptive.{textRun.Type}"); textRunSpan.FontFamily = new FontFamily(RendererUtil.GetFontFamilyFromList(context.Config.GetFontFamily(textRun.FontType))); textRunSpan.FontWeight = FontWeight.FromOpenTypeWeight(context.Config.GetFontWeight(textRun.FontType, textRun.Weight)); textRunSpan.FontSize = context.Config.GetFontSize(textRun.FontType, textRun.Size); if (textRun.Italic) { textRunSpan.FontStyle = FontStyles.Italic; } if (textRun.Strikethrough) { textRunSpan.TextDecorations.Add(TextDecorations.Strikethrough); } if (textRun.Underline) { textRunSpan.TextDecorations.Add(TextDecorations.Underline); } if (textRun.Highlight) { textRunSpan.SetHighlightColor(textRun.Color, textRun.IsSubtle, context); } textRunSpan.SetColor(textRun.Color, textRun.IsSubtle, context); uiRichTB.Inlines.Add(textRunSpan); }
public static FrameworkElement Render(AdaptiveAction action, AdaptiveRenderContext context) { if (context.Config.SupportsInteractivity && context.ActionHandlers.IsSupported(action.GetType())) { var uiButton = CreateActionButton(action, context); uiButton.Click += (sender, e) => { if (action is AdaptiveToggleVisibilityAction toggleVisibilityAction) { foreach (object targetElement in toggleVisibilityAction.TargetElements) { string targetElementId = ""; bool? targetElementIsVisible = null; if (targetElement is string targetElementString) { targetElementId = targetElementString; } else if (targetElement is AdaptiveTargetElement targetElementObject) { targetElementId = targetElementObject.ElementId; targetElementIsVisible = targetElementObject.IsVisible; } var element = LogicalTreeHelper.FindLogicalNode(context.CardRoot, targetElementId); if (element != null && element is FrameworkElement elementFrameworkElement) { Visibility visibility = elementFrameworkElement.Visibility; // if we read something with the format {"elementId": <id>", "isVisible": true} or we just read the id and the element is not visible if ((targetElementIsVisible.HasValue && targetElementIsVisible.Value) || (!targetElementIsVisible.HasValue && visibility != Visibility.Visible)) { elementFrameworkElement.Visibility = Visibility.Visible; } // otherwise if we read something with the format {"elementId": <id>", "isVisible": false} or we just read the id and the element is visible else if ((targetElementIsVisible.HasValue && !targetElementIsVisible.Value) || (!targetElementIsVisible.HasValue && visibility == Visibility.Visible)) { elementFrameworkElement.Visibility = Visibility.Collapsed; } } } } else { context.InvokeAction(uiButton, new AdaptiveActionEventArgs(action)); } // Prevent nested events from triggering e.Handled = true; }; return(uiButton); } return(null); }
public static FrameworkElement Render(AdaptiveAction action, AdaptiveRenderContext context) { if (context.Config.SupportsInteractivity && context.ActionHandlers.IsSupported(action.GetType())) { var uiButton = CreateActionButton(action, context); uiButton.Click += (sender, e) => { context.InvokeAction(uiButton, new AdaptiveActionEventArgs(action)); }; return(uiButton); } return(null); }
public static FrameworkElement Render(AdaptiveTextInput input, AdaptiveRenderContext context) { if (context.Config.SupportsInteractivity) { var textBox = new WatermarkTextBox() { Text = input.Value }; if (input.IsMultiline == true) { textBox.AcceptsReturn = true; textBox.TextWrapping = TextWrapping.Wrap; textBox.HorizontalScrollBarVisibility = ScrollBarVisibility.Disabled; } if (input.MaxLength > 0) { textBox.MaxLength = input.MaxLength; } textBox.Watermark = input.Placeholder; textBox.Style = context.GetStyle($"Adaptive.Input.Text.{input.Style}"); textBox.DataContext = input; context.InputBindings.Add(input.Id, () => textBox.Text); if (input.InlineAction != null) { if (context.Config.Actions.ShowCard.ActionMode == ShowCardActionMode.Inline && input.InlineAction.GetType() == typeof(AdaptiveShowCardAction)) { context.Warnings.Add(new AdaptiveWarning(-1, "Inline ShowCard not supported for InlineAction")); } else { if (context.Config.SupportsInteractivity && context.ActionHandlers.IsSupported(input.InlineAction.GetType())) { // Set up a parent view that holds textbox, separator and button var parentView = new Grid(); // grid config for textbox parentView.ColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(1, GridUnitType.Star) }); Grid.SetColumn(textBox, 0); parentView.Children.Add(textBox); // grid config for spacing int spacing = context.Config.GetSpacing(AdaptiveSpacing.Default); var uiSep = new Grid { Style = context.GetStyle($"Adaptive.Input.Text.InlineAction.Separator"), VerticalAlignment = VerticalAlignment.Stretch, Width = spacing, }; parentView.ColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(spacing, GridUnitType.Pixel) }); Grid.SetColumn(uiSep, 1); // adding button var uiButton = new Button(); Style style = context.GetStyle($"Adaptive.Input.Text.InlineAction.Button"); if (style != null) { uiButton.Style = style; } // this textblock becomes tooltip if icon url exists else becomes the tile for the button var uiTitle = new TextBlock { Text = input.InlineAction.Title, }; if (input.InlineAction.IconUrl != null) { var actionsConfig = context.Config.Actions; var image = new AdaptiveImage(input.InlineAction.IconUrl) { HorizontalAlignment = AdaptiveHorizontalAlignment.Center, Type = "Adaptive.Input.Text.InlineAction.Image", }; FrameworkElement uiIcon = null; uiIcon = AdaptiveImageRenderer.Render(image, context); uiButton.Content = uiIcon; // adjust height textBox.Loaded += (sender, e) => { uiIcon.Height = textBox.ActualHeight; }; uiButton.ToolTip = uiTitle; } else { uiTitle.FontSize = context.Config.GetFontSize(AdaptiveFontStyle.Default, AdaptiveTextSize.Default); uiTitle.Style = context.GetStyle($"Adaptive.Input.Text.InlineAction.Title"); uiButton.Content = uiTitle; } uiButton.Click += (sender, e) => { context.InvokeAction(uiButton, new AdaptiveActionEventArgs(input.InlineAction)); // Prevent nested events from triggering e.Handled = true; }; parentView.ColumnDefinitions.Add(new ColumnDefinition() { Width = GridLength.Auto }); Grid.SetColumn(uiButton, 2); parentView.Children.Add(uiButton); uiButton.VerticalAlignment = VerticalAlignment.Bottom; textBox.KeyDown += (sender, e) => { if (e.Key == System.Windows.Input.Key.Enter) { context.InvokeAction(uiButton, new AdaptiveActionEventArgs(input.InlineAction)); e.Handled = true; } }; return(parentView); } } } return(textBox); } else { var textBlock = AdaptiveTypedElementConverter.CreateElement <AdaptiveTextBlock>(); textBlock.Text = XamlUtilities.GetFallbackText(input) ?? input.Placeholder; return(context.Render(textBlock)); } }
public static FrameworkElement RenderInlineAction(AdaptiveTextInput input, AdaptiveRenderContext context, FrameworkElement textBox) { // Set up a parent view that holds textbox, separator and button var parentView = new Grid(); // grid config for textbox parentView.ColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(1, GridUnitType.Star) }); Grid.SetColumn(textBox, 0); parentView.Children.Add(textBox); // grid config for spacing int spacing = context.Config.GetSpacing(AdaptiveSpacing.Default); var uiSep = new Grid { Style = context.GetStyle($"Adaptive.Input.Text.InlineAction.Separator"), VerticalAlignment = VerticalAlignment.Stretch, Width = spacing, }; parentView.ColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(spacing, GridUnitType.Pixel) }); Grid.SetColumn(uiSep, 1); // adding button var uiButton = new Button(); Style style = context.GetStyle($"Adaptive.Input.Text.InlineAction.Button"); if (style != null) { uiButton.Style = style; } // this textblock becomes tooltip if icon url exists else becomes the tile for the button var uiTitle = new TextBlock { Text = input.InlineAction.Title, }; if (input.InlineAction.IconUrl != null) { var actionsConfig = context.Config.Actions; var image = new AdaptiveImage(input.InlineAction.IconUrl) { HorizontalAlignment = AdaptiveHorizontalAlignment.Center, Type = "Adaptive.Input.Text.InlineAction.Image", }; FrameworkElement uiIcon = null; uiIcon = AdaptiveImageRenderer.Render(image, context); uiButton.Content = uiIcon; // adjust height textBox.Loaded += (sender, e) => { uiIcon.Height = textBox.ActualHeight; }; uiButton.ToolTip = uiTitle; } else { uiTitle.FontSize = context.Config.GetFontSize(AdaptiveFontType.Default, AdaptiveTextSize.Default); uiTitle.Style = context.GetStyle($"Adaptive.Input.Text.InlineAction.Title"); uiButton.Content = uiTitle; } uiButton.Click += (sender, e) => { context.InvokeAction(uiButton, new AdaptiveActionEventArgs(input.InlineAction)); // Prevent nested events from triggering e.Handled = true; }; parentView.ColumnDefinitions.Add(new ColumnDefinition() { Width = GridLength.Auto }); Grid.SetColumn(uiButton, 2); parentView.Children.Add(uiButton); uiButton.VerticalAlignment = VerticalAlignment.Bottom; textBox.KeyDown += (sender, e) => { if (e.Key == System.Windows.Input.Key.Enter) { context.InvokeAction(uiButton, new AdaptiveActionEventArgs(input.InlineAction)); e.Handled = true; } }; return(parentView); }