From 89c79d1cb5a575ad0caaadd8fa55b8576c80d253 Mon Sep 17 00:00:00 2001 From: Lex Li Date: Tue, 12 May 2026 23:23:20 -0400 Subject: [PATCH 1/2] Switch to a single rich text block --- .../Visitors/NativeMarkdownVisitor.cs | 62 ++++++++++++++----- 1 file changed, 47 insertions(+), 15 deletions(-) diff --git a/src/WinUI.Markdown/Visitors/NativeMarkdownVisitor.cs b/src/WinUI.Markdown/Visitors/NativeMarkdownVisitor.cs index 4f4d9ea..6bd07db 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,19 @@ 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 - { - Text = InlineText(heading.Inline), - FontFamily = _theme.BodyFont, - FontSize = fontSize, - FontWeight = HeadingWeight(sizeIndex), - LineHeight = fontSize * 1.25, - TextWrapping = TextWrapping.WrapWholeWords, - Foreground = _theme.Foreground - }; + 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(); + 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 +130,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 }; } From 879cf7f295d51d36dd15c5e67ced8f09648e787b Mon Sep 17 00:00:00 2001 From: Lex Li Date: Wed, 13 May 2026 19:01:06 -0400 Subject: [PATCH 2/2] Fix heading style --- src/WinUI.Markdown/Visitors/NativeMarkdownVisitor.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/WinUI.Markdown/Visitors/NativeMarkdownVisitor.cs b/src/WinUI.Markdown/Visitors/NativeMarkdownVisitor.cs index 6bd07db..0517052 100644 --- a/src/WinUI.Markdown/Visitors/NativeMarkdownVisitor.cs +++ b/src/WinUI.Markdown/Visitors/NativeMarkdownVisitor.cs @@ -115,7 +115,12 @@ private FrameworkElement RenderHeading(HeadingBlock heading, bool isFirstInConta block.FontWeight = HeadingWeight(sizeIndex); block.LineHeight = fontSize * 1.25; - var paragraph = new Paragraph(); + var paragraph = new Paragraph + { + FontSize = fontSize, + FontWeight = HeadingWeight(sizeIndex), + LineHeight = fontSize * 1.25 + }; AppendInlines(paragraph.Inlines, heading.Inline); block.Blocks.Add(paragraph);