diff --git a/src/settings-ui/Settings.UI/SettingsXAML/OOBE/Views/ScoobeReleaseNotesPage.xaml b/src/settings-ui/Settings.UI/SettingsXAML/OOBE/Views/ScoobeReleaseNotesPage.xaml index b5e0abb4f691..9c361ea7d647 100644 --- a/src/settings-ui/Settings.UI/SettingsXAML/OOBE/Views/ScoobeReleaseNotesPage.xaml +++ b/src/settings-ui/Settings.UI/SettingsXAML/OOBE/Views/ScoobeReleaseNotesPage.xaml @@ -7,27 +7,6 @@ xmlns:tkcontrols="using:CommunityToolkit.WinUI.Controls" Loaded="Page_Loaded" mc:Ignorable="d"> - - - - - @@ -51,7 +30,7 @@ Visibility="Visible" /> _currentReleases; + private string _currentMarkdown; /// /// Initializes a new instance of the class. @@ -26,6 +30,7 @@ public sealed partial class ScoobeReleaseNotesPage : Page public ScoobeReleaseNotesPage() { this.InitializeComponent(); + Unloaded += OnUnloaded; } /// @@ -128,6 +133,7 @@ private void DisplayReleaseNotes() LoadingProgressRing.Visibility = Visibility.Collapsed; var (releaseNotesMarkdown, heroImageUrl) = ProcessReleaseNotesMarkdown(_currentReleases); + _currentMarkdown = releaseNotesMarkdown; // Set the Hero image if found if (!string.IsNullOrEmpty(heroImageUrl)) @@ -140,7 +146,7 @@ private void DisplayReleaseNotes() HeroImageHolder.Visibility = Visibility.Collapsed; } - ReleaseNotesMarkdown.Text = releaseNotesMarkdown; + ApplyThemeAndRenderMarkdown(); ReleaseNotesMarkdown.Visibility = Visibility.Visible; } catch (Exception ex) @@ -151,9 +157,81 @@ private void DisplayReleaseNotes() private void Page_Loaded(object sender, RoutedEventArgs e) { + ActualThemeChanged += OnActualThemeChanged; + App.ThemeService.ThemeChanged += OnAppThemeChanged; DisplayReleaseNotes(); } + private void OnActualThemeChanged(FrameworkElement sender, object args) + { + ApplyThemeAndRenderMarkdown(); + } + + private void OnAppThemeChanged(object sender, ElementTheme theme) + { + if (DispatcherQueue.HasThreadAccess) + { + ApplyThemeAndRenderMarkdown(); + return; + } + + _ = DispatcherQueue.TryEnqueue(ApplyThemeAndRenderMarkdown); + } + + private void ApplyThemeAndRenderMarkdown() + { + var headingForeground = ReleaseNotesMarkdown.Foreground as Brush; + if (headingForeground == null) + { + return; + } + + ReleaseNotesMarkdown.Config = BuildMarkdownConfig(headingForeground); + + if (string.IsNullOrEmpty(_currentMarkdown)) + { + return; + } + + // Force markdown regeneration so headings pick up the updated theme config. + ReleaseNotesMarkdown.Text = string.Empty; + ReleaseNotesMarkdown.Text = _currentMarkdown; + } + + private static MarkdownConfig BuildMarkdownConfig(Brush headingForeground) + { + return new MarkdownConfig + { + Themes = new MarkdownThemes + { + BoldFontWeight = FontWeights.SemiBold, + H1FontSize = 28, + H1FontWeight = FontWeights.SemiBold, + H1Margin = new Thickness(0, 36, 0, 8), + H1Foreground = headingForeground, + H2FontSize = 20, + H2FontWeight = FontWeights.SemiBold, + H2Margin = new Thickness(0, 16, 0, 4), + H2Foreground = headingForeground, + H3FontSize = 16, + H3FontWeight = FontWeights.SemiBold, + H3Margin = new Thickness(0, 16, 0, 4), + H3Foreground = headingForeground, + HorizontalRuleThickness = 1, + ImageStretch = Stretch.Uniform, + ListBulletSpacing = 1, + ListGutterWidth = 10, + }, + }; + } + + private void OnUnloaded(object sender, RoutedEventArgs e) + { + ActualThemeChanged -= OnActualThemeChanged; + App.ThemeService.ThemeChanged -= OnAppThemeChanged; + Unloaded -= OnUnloaded; + } + protected override void OnNavigatedTo(NavigationEventArgs e) { if (e.Parameter is IList releases)