diff --git a/src/WinUI.Markdown/Visitors/NativeMarkdownVisitor.cs b/src/WinUI.Markdown/Visitors/NativeMarkdownVisitor.cs index 4f4d9ea..0517052 100644 --- a/src/WinUI.Markdown/Visitors/NativeMarkdownVisitor.cs +++ b/src/WinUI.Markdown/Visitors/NativeMarkdownVisitor.cs @@ -34,11 +34,13 @@ public NativeMarkdownVisitor(MarkdownTheme theme) public FrameworkElement Render(MarkdownDocument document) { - var root = CreateStackPanel(); + var root = CreateRichTextBlock(); + root.IsTextSelectionEnabled = true; + var blockIndex = 0; foreach (var block in document) { - root.Children.Add(RenderBlock(block, 0, blockIndex == 0)); + AddRenderedBlock(root.Blocks, RenderBlock(block, 0, blockIndex == 0)); blockIndex++; } @@ -50,6 +52,38 @@ public FrameworkElement Render(MarkdownDocument document) }; } + private void AddRenderedBlock(BlockCollection target, FrameworkElement element) + { + if (element is RichTextBlock richTextBlock) + { + while (richTextBlock.Blocks.Count > 0) + { + var block = richTextBlock.Blocks[0]; + richTextBlock.Blocks.RemoveAt(0); + target.Add(block); + } + + return; + } + + RenderUiBlock(target, element); + } + + private static void RenderUiBlock(BlockCollection target, UIElement child) + { + target.Add(new Paragraph + { + Margin = new Thickness(0), + Inlines = + { + new InlineUIContainer + { + Child = child + } + } + }); + } + private FrameworkElement RenderBlock(MarkdigBlock block, int nestingLevel, bool isFirstInContainer = false) { return block switch @@ -75,21 +109,24 @@ private FrameworkElement RenderHeading(HeadingBlock heading, bool isFirstInConta var sizeIndex = Math.Clamp(heading.Level - 1, 0, 5); var fontSize = HeadingSize(sizeIndex); var borderThickness = HeadingBorderThickness(sizeIndex); - var textBlock = new TextBlock + var block = CreateRichTextBlock(); + block.Margin = new Thickness(0, isFirstInContainer ? 0 : _theme.HeadingSpacingBefore, 0, _theme.HeadingSpacingAfter); + block.FontSize = fontSize; + block.FontWeight = HeadingWeight(sizeIndex); + block.LineHeight = fontSize * 1.25; + + var paragraph = new Paragraph { - Text = InlineText(heading.Inline), - FontFamily = _theme.BodyFont, FontSize = fontSize, FontWeight = HeadingWeight(sizeIndex), - LineHeight = fontSize * 1.25, - TextWrapping = TextWrapping.WrapWholeWords, - Foreground = _theme.Foreground + LineHeight = fontSize * 1.25 }; + AppendInlines(paragraph.Inlines, heading.Inline); + block.Blocks.Add(paragraph); if (borderThickness <= 0) { - textBlock.Margin = new Thickness(0, isFirstInContainer ? 0 : _theme.HeadingSpacingBefore, 0, _theme.HeadingSpacingAfter); - return textBlock; + return block; } return new Border @@ -98,7 +135,7 @@ private FrameworkElement RenderHeading(HeadingBlock heading, bool isFirstInConta BorderThickness = new Thickness(0, 0, 0, borderThickness), Padding = new Thickness(0, 0, 0, fontSize * _theme.HeadingBorderPaddingEm), Margin = new Thickness(0, isFirstInContainer ? 0 : _theme.HeadingSpacingBefore, 0, _theme.HeadingSpacingAfter), - Child = textBlock + Child = block }; }