diff --git a/components/MarkdownTextBlock/src/HtmlWriter.cs b/components/MarkdownTextBlock/src/HtmlWriter.cs index a581583bb..1b2557992 100644 --- a/components/MarkdownTextBlock/src/HtmlWriter.cs +++ b/components/MarkdownTextBlock/src/HtmlWriter.cs @@ -36,7 +36,13 @@ public static void WriteHtml(WinUIRenderer renderer, HtmlNodeCollection nodes) var myHyperlinkButton = new MyHyperlinkButton(node, renderer.Config.BaseUrl); myHyperlinkButton.ClickEvent += (sender, e) => { - renderer.MarkdownTextBlock.RaiseLinkClickedEvent(((HyperlinkButton)sender).NavigateUri); + var button = (HyperlinkButton)sender; + var uri = button.NavigateUri; + var handled = renderer.MarkdownTextBlock.RaiseLinkClickedEvent(uri); + if (handled) + { + button.NavigateUri = null; + } }; hyperLink = myHyperlinkButton; } @@ -45,7 +51,12 @@ public static void WriteHtml(WinUIRenderer renderer, HtmlNodeCollection nodes) var myHyperlink = new MyHyperlink(node, renderer.Config.BaseUrl); myHyperlink.ClickEvent += (sender, e) => { - renderer.MarkdownTextBlock.RaiseLinkClickedEvent(sender.NavigateUri); + var uri = sender.NavigateUri; + var handled = renderer.MarkdownTextBlock.RaiseLinkClickedEvent(uri); + if (handled) + { + sender.NavigateUri = null; + } }; hyperLink = myHyperlink; } diff --git a/components/MarkdownTextBlock/src/LinkClickedEventArgs.cs b/components/MarkdownTextBlock/src/LinkClickedEventArgs.cs index dc48ea601..3748c6bd4 100644 --- a/components/MarkdownTextBlock/src/LinkClickedEventArgs.cs +++ b/components/MarkdownTextBlock/src/LinkClickedEventArgs.cs @@ -7,6 +7,10 @@ namespace CommunityToolkit.WinUI.Controls; public class LinkClickedEventArgs : EventArgs { public Uri Uri { get; } + /// + /// Set to true in your handler to indicate the link click was handled and default navigation should be suppressed. + /// + public bool Handled { get; set; } public LinkClickedEventArgs(Uri uri) { diff --git a/components/MarkdownTextBlock/src/MarkdownTextBlock.xaml.cs b/components/MarkdownTextBlock/src/MarkdownTextBlock.xaml.cs index 9f2f38ca2..d3a55829b 100644 --- a/components/MarkdownTextBlock/src/MarkdownTextBlock.xaml.cs +++ b/components/MarkdownTextBlock/src/MarkdownTextBlock.xaml.cs @@ -23,7 +23,16 @@ public partial class MarkdownTextBlock : Control public event EventHandler? OnLinkClicked; - internal void RaiseLinkClickedEvent(Uri uri) => OnLinkClicked?.Invoke(this, new LinkClickedEventArgs(uri)); + internal bool RaiseLinkClickedEvent(Uri uri) + { + if (OnLinkClicked == null) + { + return false; + } + var args = new LinkClickedEventArgs(uri); + OnLinkClicked?.Invoke(this, args); + return args.Handled; + } private static void OnConfigChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { diff --git a/components/MarkdownTextBlock/src/Renderers/ObjectRenderers/Inlines/LinkInlineRenderer.cs b/components/MarkdownTextBlock/src/Renderers/ObjectRenderers/Inlines/LinkInlineRenderer.cs index a14091eca..08b290ea1 100644 --- a/components/MarkdownTextBlock/src/Renderers/ObjectRenderers/Inlines/LinkInlineRenderer.cs +++ b/components/MarkdownTextBlock/src/Renderers/ObjectRenderers/Inlines/LinkInlineRenderer.cs @@ -33,7 +33,15 @@ protected override void Write(WinUIRenderer renderer, LinkInline link) var myHyperlinkButton = new MyHyperlinkButton(link, renderer.Config.BaseUrl); myHyperlinkButton.ClickEvent += (sender, e) => { - renderer.MarkdownTextBlock.RaiseLinkClickedEvent(((HyperlinkButton)sender).NavigateUri); + var button = (HyperlinkButton)sender; + var uri = button.NavigateUri; + var handled = renderer.MarkdownTextBlock.RaiseLinkClickedEvent(uri); + if (handled) + { + // Suppress default navigation by clearing NavigateUri just for this invocation + button.NavigateUri = null; + // Optionally restore later; not needed unless reused. + } }; renderer.Push(myHyperlinkButton); } @@ -42,7 +50,13 @@ protected override void Write(WinUIRenderer renderer, LinkInline link) var hyperlink = new MyHyperlink(link, renderer.Config.BaseUrl); hyperlink.ClickEvent += (sender, e) => { - renderer.MarkdownTextBlock.RaiseLinkClickedEvent(sender.NavigateUri); + var uri = sender.NavigateUri; + var handled = renderer.MarkdownTextBlock.RaiseLinkClickedEvent(uri); + if (handled) + { + // Suppress navigation by clearing NavigateUri + sender.NavigateUri = null; + } }; renderer.Push(hyperlink);