WebViewTest.axaml代码
<Window xmlns="https://github.com/avaloniaui" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="using:Shares.Avalonia.CustomControls" x:Class="AvaloniaUI.WebBrowserTest" Title="WebBrowserTest" Height="800" Width="1068"> <Grid Margin="10" ColumnDefinitions="*,8,*,8,*" RowDefinitions="auto,8,*"> <StackPanel Grid.Row="0" Grid.Column="0" Orientation="Horizontal" Spacing="8"> <Button Content="Back" Click="Back_Click"/> <Button Content="Forward" Click="Forward_Click"/> <Button Content="Refresh" Click="Refresh_Click"/> <Button Content="Stop" Click="Stop_Click"/> </StackPanel> <Border Grid.Row="2" Grid.Column="0" BorderThickness="1" Padding="4"> <WebView x:Name="Browser"/> </Border> <Grid Grid.Row="2" Grid.Column="2" RowDefinitions="auto,4,*"> <TextBlock Text="PanelA"/> <Border Grid.Row="2" BorderThickness="1" Padding="4"> <WebView x:Name="PanelA"/> </Border> </Grid> <Grid Grid.Row="2" Grid.Column="4" RowDefinitions="auto,4,*"> <TextBlock Text="PanelB"/> <Border Grid.Row="2" BorderThickness="1" Padding="4"> <WebView x:Name="PanelB"/> </Border> </Grid> </Grid> </Window>
WebViewTest.axaml.cs代码
using Avalonia;
using Avalonia.Controls;
using Avalonia.Interactivity;
using Shares.Avalonia.CustomControls.WebView;
using System;
namespace AvaloniaUI;
public partial class WebBrowserTest : Window
{
public WebBrowserTest()
{
InitializeComponent();
Browser.Navigate("https://www.google.com");
Browser.Requesting += Browser_Requesting;
Browser.Requested += Browser_Requested;
PanelA.Requested += Browser_Requested;
Browser.NavigationCompleted += Browser_NavigationCompleted;
PanelA.NavigationCompleted += PanelA_NavigationCompleted;
PanelB.NavigationCompleted += PanelB_NavigationCompleted;
Browser.AddScriptObject("app", new AppApi());
}
~WebBrowserTest()
{
Browser.Dispose();
PanelA.Dispose();
PanelB.Dispose();
}
private void Browser_Requesting(object? sender, WebViewRequestingEventArgs e)
{
if (e.Kind == WebViewRequestKind.Resource &&
e.Uri.AbsoluteUri.Contains("tracker", StringComparison.OrdinalIgnoreCase))
{
e.Cancel = true;
Console.WriteLine($"Blocked resource: {e.Uri}");
return;
}
}
private void Browser_Requested(object? sender, WebViewRequestedEventArgs e)
{
if (sender is not WebView current)
return;
if (e.Kind == WebViewRequestKind.Navigation &&
e.Uri.Host.Contains("yahoo", StringComparison.OrdinalIgnoreCase) &&
!ReferenceEquals(current, PanelA))
{
Console.WriteLine($"Open in PanelA: {e.Uri}");
e.OpenIn(PanelA);
return;
}
if (e.Kind == WebViewRequestKind.Navigation &&
e.Uri.Host.Contains("baidu", StringComparison.OrdinalIgnoreCase) &&
!ReferenceEquals(current, PanelB))
{
Console.WriteLine($"Open in PanelB: {e.Uri}");
e.OpenIn(PanelB);
return;
}
}
private void Browser_NavigationCompleted(object? sender, WebViewNavigationCompletedEventArgs e)
{
Console.WriteLine($"Main completed: {e.Uri} success={e.IsSuccess}");
}
private void PanelA_NavigationCompleted(object? sender, WebViewNavigationCompletedEventArgs e)
{
Console.WriteLine($"PanelA completed: {e.Uri} success={e.IsSuccess}");
}
private void PanelB_NavigationCompleted(object? sender, WebViewNavigationCompletedEventArgs e)
{
Console.WriteLine($"PanelB completed: {e.Uri} success={e.IsSuccess}");
}
private void Back_Click(object? sender, RoutedEventArgs e)
=> Browser.GoBack();
private void Forward_Click(object? sender, RoutedEventArgs e)
=> Browser.GoForward();
private void Refresh_Click(object? sender, RoutedEventArgs e)
=> Browser.Refresh();
private void Stop_Click(object? sender, RoutedEventArgs e)
=> Browser.Stop();
public sealed class AppApi
{
public static string GetVersion() => "1.0.0";
}
}
运行效果

浙公网安备 33010602011771号