From b6eae86b3361d9b8763ed79c431db8067800763f Mon Sep 17 00:00:00 2001 From: Jiaqi Liu Date: Mon, 23 Mar 2020 00:30:06 -0700 Subject: [PATCH 1/2] [Bug fix] Fixed a bug where MarkdownTextBlock loses all events after re-load [Bug fix] Fixed a bug where MarkdownTextBlock loses all events after re-load. Issue is described here: https://github.com/JasonStein/Notepads/issues/377 --- .../MarkdownTextBlock.Methods.cs | 24 +++++++++++++++---- .../MarkdownTextBlock/MarkdownTextBlock.cs | 1 + 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/Microsoft.Toolkit.Uwp.UI.Controls/MarkdownTextBlock/MarkdownTextBlock.Methods.cs b/Microsoft.Toolkit.Uwp.UI.Controls/MarkdownTextBlock/MarkdownTextBlock.Methods.cs index 3ee1149517d..ffca84e3e05 100644 --- a/Microsoft.Toolkit.Uwp.UI.Controls/MarkdownTextBlock/MarkdownTextBlock.Methods.cs +++ b/Microsoft.Toolkit.Uwp.UI.Controls/MarkdownTextBlock/MarkdownTextBlock.Methods.cs @@ -48,6 +48,9 @@ private void RenderMarkdown() // Disconnect from OnClick handlers. UnhookListeners(); + // Clear everything that exists. + _listeningHyperlinks.Clear(); + var markdownRenderedArgs = new MarkdownRenderedEventArgs(null); // Make sure we have something to parse. @@ -174,9 +177,25 @@ private void RenderMarkdown() MarkdownRendered?.Invoke(this, markdownRenderedArgs); } + private void HookListeners() + { + // Re-hook all hyper link events we currently have + foreach (object link in _listeningHyperlinks) + { + if (link is Hyperlink hyperlink) + { + hyperlink.Click += Hyperlink_Click; + } + else if (link is Image image) + { + image.Tapped += NewImagelink_Tapped; + } + } + } + private void UnhookListeners() { - // Clear any hyper link events if we have any + // Unhook any hyper link events if we have any foreach (object link in _listeningHyperlinks) { if (link is Hyperlink hyperlink) @@ -188,9 +207,6 @@ private void UnhookListeners() image.Tapped -= NewImagelink_Tapped; } } - - // Clear everything that exists. - _listeningHyperlinks.Clear(); } /// diff --git a/Microsoft.Toolkit.Uwp.UI.Controls/MarkdownTextBlock/MarkdownTextBlock.cs b/Microsoft.Toolkit.Uwp.UI.Controls/MarkdownTextBlock/MarkdownTextBlock.cs index 0545ff72988..1701cc5806e 100644 --- a/Microsoft.Toolkit.Uwp.UI.Controls/MarkdownTextBlock/MarkdownTextBlock.cs +++ b/Microsoft.Toolkit.Uwp.UI.Controls/MarkdownTextBlock/MarkdownTextBlock.cs @@ -47,6 +47,7 @@ private void ThemeListener_ThemeChanged(Helpers.ThemeListener sender) private void OnLoaded(object sender, RoutedEventArgs e) { RegisterThemeChangedHandler(); + HookListeners(); // Register for property callbacks that are owned by our parent class. _fontSizePropertyToken = RegisterPropertyChangedCallback(FontSizeProperty, OnPropertyChanged); From 96b39ec617950edbdc6fcacdd29487a7ddd04b32 Mon Sep 17 00:00:00 2001 From: Jiaqi Liu Date: Tue, 24 Mar 2020 15:16:11 -0700 Subject: [PATCH 2/2] Unhook event before assigning to make sure no duplicate Unhook event before assigning to make sure no duplicate --- .../MarkdownTextBlock/MarkdownTextBlock.Methods.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Microsoft.Toolkit.Uwp.UI.Controls/MarkdownTextBlock/MarkdownTextBlock.Methods.cs b/Microsoft.Toolkit.Uwp.UI.Controls/MarkdownTextBlock/MarkdownTextBlock.Methods.cs index ffca84e3e05..dac3a18170e 100644 --- a/Microsoft.Toolkit.Uwp.UI.Controls/MarkdownTextBlock/MarkdownTextBlock.Methods.cs +++ b/Microsoft.Toolkit.Uwp.UI.Controls/MarkdownTextBlock/MarkdownTextBlock.Methods.cs @@ -184,10 +184,12 @@ private void HookListeners() { if (link is Hyperlink hyperlink) { + hyperlink.Click -= Hyperlink_Click; hyperlink.Click += Hyperlink_Click; } else if (link is Image image) { + image.Tapped -= NewImagelink_Tapped; image.Tapped += NewImagelink_Tapped; } }