У меня есть базовое гибридное приложение MAUI Blazor с одной страницей xaml: MainPage.xaml, и в нем есть один компонент: BlazorWebView.
<?xml version = "1.0" encoding = "utf-8" ?>
<ContentPage
x:Class = "MyApp.MainPage"
xmlns = "http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x = "http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:ios = "clr-namespace:Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific;assembly=Microsoft.Maui.Controls"
xmlns:local = "clr-namespace:MyApp"
ios:Page.UseSafeArea = "True"
BackgroundColor = "{DynamicResource PageBackgroundColor}">
<BlazorWebView x:Name = "blazorWebView" HostPage = "wwwroot/index.html">
<BlazorWebView.RootComponents>
<RootComponent ComponentType = "{x:Type local:Components.Routes}" Selector = "#app" />
</BlazorWebView.RootComponents>
</BlazorWebView>
</ContentPage>
Я хотел бы иметь возможность перезагрузить содержимое BlazorWebView (загрузить его так, как будто я только что достиг MainPage.xaml)
Я попробовал сделать
var hostPage = blazorWebView.HostPage;
blazorWebView.HostPage = null;
blazorWebView.HostPage = hostPage;
но это не имело никакого эффекта.
Даже установка blazorWebView = null;
ничего не дала
Эта ссылка отвечает на ваш вопрос?
В моем тесте URL-адрес blazorwebview по умолчанию — https://0.0.0.0/, поэтому вы можете вызвать код платформы, чтобы перезагрузить URL-адрес. Но чтобы URL всегда был правильным, я получаю его программно.
На главной странице:
public partial class MainPage : ContentPage
{
public string url;
public BlazorWebView view;
public MainPage()
{
InitializeComponent();
view = blazorWebView;
}
public void Reload()
{
#if Android
var androidweb = blazorWebView.Handler.PlatformView as Android.Webkit.WebView;
androidweb.LoadUrl(url);
#elif WINDOWS
var windowweb = blazorWebView.Handler.PlatformView as Microsoft.UI.Xaml.Controls.WebView2;
windowweb.Source = new Uri(url);
#elif IOS
var iosweb = blazorWebView.Handler.PlatformView as WebKit.WKWebView;
iosweb.LoadRequest(new Foundation.NSUrlRequest(new Uri(url)));
#endif
}
}
В Home.Razor:
@code{
protected override void OnInitialized()
{
base.OnInitialized();
#if Android
var androidweb = (App.Current.MainPage as MainPage).view.Handler.PlatformView as Android.Webkit.WebView;
(App.Current.MainPage as MainPage).url = androidweb.Url;
#elif WINDOWS
var windowweb = (App.Current.MainPage as MainPage).view.Handler.PlatformView as Microsoft.UI.Xaml.Controls.WebView2;
(App.Current.MainPage as MainPage).url = windowweb.Source.ToString();
#elif IOS
var iosweb = (App.Current.MainPage as MainPage).view.Handler.PlatformView as WebKit.WKWebView;
(App.Current.MainPage as MainPage).url = iosweb.Url.ToString();
#endif
}
}
Затем вы можете вызвать метод Reload, чтобы перезагрузить веб-представление Blazor. Почему я получаю URL-адрес по умолчанию в Home.Razor, так это то, что я не могу получить его в методе жизненного цикла MainPage на платформе Windows.
=====================
У меня есть другой, более простой способ сделать это. Вы можете создать новый BlazorWebView и установить его в качестве содержимого страницы:
public partial class MainPage : ContentPage
{
public MainPage()
{
InitializeComponent();
}
public void Reload()
{
var newview = new BlazorWebView() { HostPage = "wwwroot/index.html" };
newview.RootComponents.Add(new RootComponent() { Selector = "#app", ComponentType = typeof(Routes) });
this.Content = newview;
}
}
Ух ты, не думал, что это будет так сложно и понадобится код, специфичный для платформы. Отличный ответ
У меня есть другой, более простой способ. Вы можете проверить часть обновления в моем ответе. @adinas
Это тоже хорошая идея. Я буду использовать это на самом деле
Вы можете сохранить URL-адрес при первом отображении blazorwebview, а затем вызвать код платформы, чтобы перезагрузить URL-адрес.