diff --git a/DiscordChatExporter.Gui/Converters/MarkdownToInlinesConverter.cs b/DiscordChatExporter.Gui/Converters/MarkdownToInlinesConverter.cs index cbb17ae8..9e50f3a3 100644 --- a/DiscordChatExporter.Gui/Converters/MarkdownToInlinesConverter.cs +++ b/DiscordChatExporter.Gui/Converters/MarkdownToInlinesConverter.cs @@ -1,12 +1,9 @@ using System; -using System.Diagnostics; using System.Globalization; using System.Linq; using Avalonia.Controls.Documents; using Avalonia.Data.Converters; using Avalonia.Media; -using CommunityToolkit.Mvvm.Input; -using DiscordChatExporter.Gui.Utils.Extensions; using DiscordChatExporter.Gui.Views.Controls; using Markdig; using Markdig.Syntax; @@ -82,18 +79,16 @@ public class MarkdownToInlinesConverter : IValueConverter break; } - case LinkInline link when link.Url is not null: + case LinkInline link when !string.IsNullOrWhiteSpace(link.Url): { - var text = string.Concat( - link.OfType().Select(l => l.Content.ToString()) - ); - var url = link.Url; inlines.Add( new InlineUIContainer( new HyperLink { - Text = text, - Command = new RelayCommand(() => Process.StartShellExecute(url)), + Text = string.Concat( + link.OfType().Select(l => l.Content.ToString()) + ), + Url = link.Url, } ) ); diff --git a/DiscordChatExporter.Gui/Views/Controls/HyperLink.axaml.cs b/DiscordChatExporter.Gui/Views/Controls/HyperLink.axaml.cs index 08452c12..53084e95 100644 --- a/DiscordChatExporter.Gui/Views/Controls/HyperLink.axaml.cs +++ b/DiscordChatExporter.Gui/Views/Controls/HyperLink.axaml.cs @@ -1,7 +1,10 @@ -using System.Windows.Input; +using System; +using System.Diagnostics; +using System.Windows.Input; using Avalonia; using Avalonia.Controls; using Avalonia.Input; +using DiscordChatExporter.Gui.Utils.Extensions; namespace DiscordChatExporter.Gui.Views.Controls; @@ -16,6 +19,12 @@ public partial class HyperLink : UserControl public static readonly StyledProperty CommandParameterProperty = Button.CommandParameterProperty.AddOwner(); + // If Url is set and Command is not set, clicking will open this URL in the default browser. + public static readonly StyledProperty UrlProperty = AvaloniaProperty.Register< + HyperLink, + string? + >(nameof(Url)); + public HyperLink() => InitializeComponent(); public string? Text @@ -36,14 +45,26 @@ public partial class HyperLink : UserControl set => SetValue(CommandParameterProperty, value); } + public string? Url + { + get => GetValue(UrlProperty); + set => SetValue(UrlProperty, value); + } + private void TextBlock_OnPointerReleased(object? sender, PointerReleasedEventArgs args) { - if (Command is null) - return; - - if (!Command.CanExecute(CommandParameter)) - return; - - Command.Execute(CommandParameter); + if (Command is not null) + { + if (Command.CanExecute(CommandParameter)) + Command.Execute(CommandParameter); + } + else if ( + !string.IsNullOrWhiteSpace(Url) + && Uri.TryCreate(Url, UriKind.Absolute, out var uri) + && (uri.Scheme == Uri.UriSchemeHttp || uri.Scheme == Uri.UriSchemeHttps) + ) + { + Process.StartShellExecute(uri.AbsoluteUri); + } } }