Я протестировал несколько изменений в своем коде для получения 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. Не работает. Возможно, один из ваших профессионалов. может мне помочь.
Я скомпилировал приложение. при первом запуске все работало. но когда я меняю веб-страницу внутри веб-просмотра, URL-адрес не обновляется. он не вызывает ни навигационный метод, ни метод навигации
Вы имеете в виду, что если вы нажмете ссылку в своем веб-просмотре, URL-адрес (urlEntry.Text) не обновится?
да сэр. позвольте мне объяснить это вам. у меня есть приложение. есть (например) текстовое поле = urlEntry. под этой записью находится веб-просмотр. Внутри веб-просмотра загружается целевая страница. YouTube!!. когда я выбираю песню, я нажимаю на нее. сайт меняет URL. я хочу распечатать URL-адрес последнего сайта в urlentrybox
Ты имеешь в виду типа вот этого?
Да, сэр, верно. когда я открываю YouTube и нажимаю на какое-нибудь видео, видео начинается, и URL-адрес этого видео отображается в URL-адресе
Итак, вы хотите такого или другого эффекта?
нет, нет, это будет абсолютно идеально





Вы можете попробовать следующий код:
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
});
}
....
Это работает для этого сайта. у меня не работает ютуб.
Кажется, я не могу добраться до URL-адреса YouTube. Это проблема
Скорее всего это связано с ютубом. На самом деле URL-адрес не изменился, он все еще находится на предыдущей странице.
Попробовать другой сайт?
У меня уже есть приложение Winforms почти с теми же классами. Я получаю URL-адрес с YouTube. Но я не могу перевести это на Android
Вы можете добавить код в сообщение.
Private void WebView2_SourceChanged (объект? отправитель, Microsoft.Web.WebView2.Core.CoreWebView2SourceChangedEventArgs e) { UpdateUrl(); } #endregion #region UpdateUrlMethode // выберите все частные недействительные UpdateUrl() { if (this.webView21.Source != null) { URLtxtBox.Text = webView21.CoreWebView2.Source; } }
извини, я новичок и не знаю, как мне написать
Неважно. Один вопрос: добавьте точку останова в эту строку YoutubeWebView_Navigating, когда вы нажмете ссылку, достигнет ли она точки останова для вызова метода YoutubeWebView_Navigating?
Надеюсь, вы имеете в виду приложение maui.net. когда я компилирую приложение для отладки в первом раунде, да. когда я меняю ссылку, оба метода пропускаются
Что ж, я вернулся и обновил ответ, надеюсь, он вам поможет :)
У меня проблема с android.webkit.webview. этот Nuget не принят в моем проекте. Я думаю, что это проблема с лицензией.
Большое спасибо за ваши усилия
Или может оно заблокировано на ютубе. Гугл работал и любой другой сайт
У меня проблема с android.webkit.webview. этот Nuget не принят в моем проекте. Видите это? Или, возможно, его заблокировал YouTube. Да, это должна быть проблема, вызванная YouTube.
Но большое спасибо
Я тестирую предоставленный вами код, он может получить e.url и успешно установить urlEntry.Text. Смотрите это.