Перезагрузите BlazorWebView на странице xaml MAUI

У меня есть базовое гибридное приложение 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, а затем вызвать код платформы, чтобы перезагрузить URL-адрес.

Liyun Zhang - MSFT 08.07.2024 03:06

Эта ссылка отвечает на ваш вопрос?

Guy Lowe 08.07.2024 04:27
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
72
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В моем тесте 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 08.07.2024 09:09

У меня есть другой, более простой способ. Вы можете проверить часть обновления в моем ответе. @adinas

Liyun Zhang - MSFT 09.07.2024 04:03

Это тоже хорошая идея. Я буду использовать это на самом деле

adinas 09.07.2024 10:18

Другие вопросы по теме