Получите URL-адрес со стороны внутри WebView в Maui.Net

Я протестировал несколько изменений в своем коде для получения URL-адреса веб-страницы из объекта WebView и печати URL-адреса для записи.

private async void YoutubeWebView_Navigated(object? sender, WebNavigatedEventArgs e)
{
    try
    {
        string currentUrl = await youtubeWebView.EvaluateJavaScriptAsync(
            "window.location.href;");
        urlEntry.Text = currentUrl;
    }
    catch (Exception ex)
    {
        await Console.Out.WriteLineAsync($"JavaScript execution error: {ex.Message}");
        throw;
    }
}

private void YoutubeWebView_Navigating(object? sender, WebNavigatingEventArgs e)
{
    urlEntry.Text = e.Url;
}

Я проверил e.url. Не работает. ОценитьJavaScriptAsync. Не работает. измените Webview.source. Не работает. Возможно, один из ваших профессионалов. может мне помочь.

Я тестирую предоставленный вами код, он может получить e.url и успешно установить urlEntry.Text. Смотрите это.

Jianwei Sun - MSFT 18.06.2024 09:45

Я скомпилировал приложение. при первом запуске все работало. но когда я меняю веб-страницу внутри веб-просмотра, URL-адрес не обновляется. он не вызывает ни навигационный метод, ни метод навигации

viki 18.06.2024 09:46

Вы имеете в виду, что если вы нажмете ссылку в своем веб-просмотре, URL-адрес (urlEntry.Text) не обновится?

Jianwei Sun - MSFT 18.06.2024 09:52

да сэр. позвольте мне объяснить это вам. у меня есть приложение. есть (например) текстовое поле = urlEntry. под этой записью находится веб-просмотр. Внутри веб-просмотра загружается целевая страница. YouTube!!. когда я выбираю песню, я нажимаю на нее. сайт меняет URL. я хочу распечатать URL-адрес последнего сайта в urlentrybox

viki 18.06.2024 09:59

Ты имеешь в виду типа вот этого?

Jianwei Sun - MSFT 18.06.2024 10:21

Да, сэр, верно. когда я открываю YouTube и нажимаю на какое-нибудь видео, видео начинается, и URL-адрес этого видео отображается в URL-адресе

viki 18.06.2024 10:30

Итак, вы хотите такого или другого эффекта?

Jianwei Sun - MSFT 18.06.2024 10:34

нет, нет, это будет абсолютно идеально

viki 18.06.2024 10:35
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать 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
8
120
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Вы можете попробовать следующий код:

xaml:

<Entry x:Name = "urlentry" TextColor = "OrangeRed"/>
 
<WebView Source = "https://learn.microsoft.com/en-us/dotnet/maui/user-interface/layouts/grid?view=net-maui-8.0"
         x:Name = "webview"
         Navigating = "webview_Navigating"
         Navigated = "webview_Navigated"
         HeightRequest = "500"/>

код позади:

private void webview_Navigating(object sender, WebNavigatingEventArgs e)
{
    urlentry.Text = e.Url;
}
 
private async void webview_Navigated(object sender, WebNavigatedEventArgs e)
{
    try 
    { 
        string currentUrl = await webview.EvaluateJavaScriptAsync("window.location.href;"); 
        urlentry.Text = currentUrl; 
    } 
    catch (Exception ex) 
    { 
        await Console.Out.WriteLineAsync($"JavaScript execution error: {ex.Message}"); 
        throw; 
    }
}

Вы можете попробовать установить Source WebView на .NET MAUI, чтобы посмотреть, обновится ли urlentry.Text.

Обновлять:

Для Android вы можете использовать метод WebViewClient.DoUpdateVisitedHistory() WebView, если базовый URL-адрес не меняется, как это происходит в одностраничных приложениях, и он обнаруживает изменение URL-адреса с помощью JavaScript, что не приводит к перезагрузке веб-страницы. Кроме того, вы можете использовать WeakReferenceMessenger для обмена сообщениями (передайте URL-адрес в urlentry). Используйте следующие шаги:

Установите пакет NuGet CommunityToolkit.Mvvm в свой проект и добавьте SendItemMessage.cs в корневой каталог:

public class SendItemMessage : ValueChangedMessage<string> 
{
    public SendItemMessage(string value) : base(value)
    {
    }
}

Создайте MyClient.cs на своих платформах/Android, чтобы получить URL-адрес и отправить его:

public class MyClient: WebViewClient
{
    public override void DoUpdateVisitedHistory(global::Android.Webkit.WebView? view, string? url, bool isReload)
    {
        var a = view?.Url;
        WeakReferenceMessenger.Default.Send(new SendItemMessage(a));
        base.DoUpdateVisitedHistory(view, url, isReload);
    }
}

Измените свой веб-просмотр и получите URL-адрес в MainPage.xaml.cs:

public partial class MainPage : ContentPage
    {
        public MainPage()
        {
            InitializeComponent();
            ModifyWebView();
            WeakReferenceMessenger.Default.Register<SendItemMessage>(this, (r, m) =>
            {
                OnMessageReceived(m.Value);
            });
        }
 
        private void OnMessageReceived(string value)
        {
             urlentry.Text = value;
        }
 
        void ModifyWebView()
        {
            Microsoft.Maui.Handlers.WebViewHandler.Mapper.AppendToMapping("MyCustomization", (handler, view) =>
            {
#if ANDROID
                handler.PlatformView.SetWebViewClient(new Platforms.Android.MyClient());
#endif
            });
        }
....

Это работает для этого сайта. у меня не работает ютуб.

viki 18.06.2024 11:00

Кажется, я не могу добраться до URL-адреса YouTube. Это проблема

viki 18.06.2024 11:06

Скорее всего это связано с ютубом. На самом деле URL-адрес не изменился, он все еще находится на предыдущей странице.

Jianwei Sun - MSFT 18.06.2024 11:15

Попробовать другой сайт?

Jianwei Sun - MSFT 18.06.2024 11:16

У меня уже есть приложение Winforms почти с теми же классами. Я получаю URL-адрес с YouTube. Но я не могу перевести это на Android

viki 18.06.2024 11:30

Вы можете добавить код в сообщение.

Jianwei Sun - MSFT 18.06.2024 11:35

Private void WebView2_SourceChanged (объект? отправитель, Microsoft.Web.WebView2.Core.CoreWebView2SourceChangedEventAr‌​gs e) { UpdateUrl(); } #endregion #region UpdateUrlMethode // выберите все частные недействительные UpdateUrl() { if (this.webView21.Source != null) { URLtxtBox.Text = webView21.CoreWebView2.Source; } }

viki 18.06.2024 11:41

извини, я новичок и не знаю, как мне написать

viki 18.06.2024 11:41

Неважно. Один вопрос: добавьте точку останова в эту строку YoutubeWebView_Navigating, когда вы нажмете ссылку, достигнет ли она точки останова для вызова метода YoutubeWebView_Navigating?

Jianwei Sun - MSFT 18.06.2024 11:59

Надеюсь, вы имеете в виду приложение maui.net. когда я компилирую приложение для отладки в первом раунде, да. когда я меняю ссылку, оба метода пропускаются

viki 18.06.2024 12:10

Что ж, я вернулся и обновил ответ, надеюсь, он вам поможет :)

Jianwei Sun - MSFT 19.06.2024 10:34

У меня проблема с android.webkit.webview. этот Nuget не принят в моем проекте. Я думаю, что это проблема с лицензией.

viki 19.06.2024 13:27

Большое спасибо за ваши усилия

viki 19.06.2024 13:28

Или может оно заблокировано на ютубе. Гугл работал и любой другой сайт

viki 19.06.2024 13:30

У меня проблема с android.webkit.webview. этот Nuget не принят в моем проекте. Видите это? Или, возможно, его заблокировал YouTube. Да, это должна быть проблема, вызванная YouTube.

Jianwei Sun - MSFT 20.06.2024 09:54

Но большое спасибо

viki 20.06.2024 10:33

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