diff --git a/SharpPad.Desktop/Views/MainWindow.axaml b/SharpPad.Desktop/Views/MainWindow.axaml index c6a34d2..8ac3c09 100644 --- a/SharpPad.Desktop/Views/MainWindow.axaml +++ b/SharpPad.Desktop/Views/MainWindow.axaml @@ -31,7 +31,8 @@ Opacity="{Binding WebViewOpacity}" Background="#1E1E1E" NavigationStarting="OnNavigationStarting" - NavigationCompleted="OnNavigationCompleted"> + NavigationCompleted="OnNavigationCompleted" + WebViewNewWindowRequested="OnNewWindowRequested"> diff --git a/SharpPad.Desktop/Views/MainWindow.axaml.cs b/SharpPad.Desktop/Views/MainWindow.axaml.cs index 2152ac8..1a78d53 100644 --- a/SharpPad.Desktop/Views/MainWindow.axaml.cs +++ b/SharpPad.Desktop/Views/MainWindow.axaml.cs @@ -4,6 +4,7 @@ using SharpPad.Desktop.ViewModels; using WebViewCore.Events; using System; +using WebViewCore.Enums; namespace SharpPad.Desktop.Views; @@ -46,4 +47,32 @@ protected override void OnClosed(EventArgs e) base.OnClosed(e); _bridge.Dispose(); } -} + + private void OnNewWindowRequested(object? sender, WebViewNewWindowEventArgs e) + { + // 获取当前应用的基础URL + if (DataContext is MainWindowViewModel viewModel) + { + var appBaseUrl = viewModel.WebUrl; + var navigationUrl = e.Url?.ToString() ?? string.Empty; + + // 如果导航URL不是空的,并且不是应用的基础URL(或其子路径) + if (!string.IsNullOrEmpty(navigationUrl) && + !string.IsNullOrEmpty(appBaseUrl) && + Uri.TryCreate(appBaseUrl, UriKind.Absolute, out var appUri) && + Uri.TryCreate(navigationUrl, UriKind.Absolute, out var navUri)) + { + // 如果是外部链接(不同的host或scheme) + if (navUri.Host != appUri.Host || navUri.Scheme != appUri.Scheme) + { + // 取消WebView导航 + if (Uri.TryCreate(appBaseUrl, UriKind.Absolute, out var tempAppUri)) + { + e.Url = tempAppUri; + e.UrlLoadingStrategy = UrlRequestStrategy.OpenExternally; + } + } + } + } + } +} \ No newline at end of file