#c# #xamarin #xamarin.forms #xamarin.android
#c# #xamarin #xamarin.forms #xamarin.android
Вопрос:
OnAppearing
Вызывается на неправильной странице после закрытия браузера Browser.OpenAsync
Я хотел бы описать сценарий :
У меня есть 2 страницы
Основной Home.xaml
SUB ItemDetailPage.xaml
Когда я выбираю элемент из списка, Home.xaml
я делаю следующее:
async void OnItemSelected(object sender, SelectedItemChangedEventArgs args)
{
var item = args.SelectedItem as SelectedItem;
if (item == null)
return;
await Shell.Current.GoToAsync($"{nameof(ItemDetailPage)}?ItemId={item.Id}");
((ListView)sender).SelectedItem = null;
}
На странице ItemDetailPage.xaml
я нажал GoToLink
метод
private async void GoToLink(object sender, EventArgs e)
{
await Browser.OpenAsync($"https://website.com/");
}
Браузер открылся без каких-либо проблем, пока я не закрою его, код вызовет OnAppearing()
ссылку на Home.xaml
страницу и сохранит ItemDetailPage.xaml
фокус страницы, затем я снова нажимаю ItemDetailPage.xaml
await Shell.Current.GoToAsync("..");
Экран возвращается на Home.xaml
страницу, но без вызова OnAppearing()
Комментарии:
1. Попробуйте использовать ` «//{nameof(ItemDetailPage)}? ItemId={item. Id}» ` . Префикс с
//
переключается на другой стек навигации вместо перехода к активному .2. Спасибо за предложение, я попробовал это, но, к сожалению, тот же результат
3. Я создал базовую демонстрацию для тестирования кода кода функции и воспроизвел проблему. Метод OnAppearing будет вызван после закрытия браузера. После тестирования выясняется, что метод OnDisappearing ItemDetailPage не будет вызываться при открытии браузера. Попробуйте определить метод OnDisappearing для ItemDetailPage вместо метода OnAppearing для домашней страницы.
4. @JarvanZhang-MSFT Спасибо за ваши усилия, я протестировал то, что вы предложили, и да, OnDisappearing будет вызываться после закрытия ItemDetailPage, но проблема в том, что мне нужно отразить результат на домашней странице после завершения работы с ItemDetailPage, поэтому вызов OnAppearing до завершения работы с ItemDetailPage не отразит новый результат, спасибо
5. Поздравляю! Пожалуйста, отправьте решение в качестве ответа и примите его. Это будет полезно для других членов сообщества, у которых есть похожие вопросы.
Ответ №1:
Я делаю обходной путь для этой проблемы
, используя MessagingCenter
КАК показано ниже:
После закрытия ItemDetailPage.xaml
единственное событие, произошедшее на этой странице, было OnDisappearing()
Поэтому, прежде чем открывать браузер, я создаю флаг IsBrowserOpened
(Static variable)
ItemDetailPage.xaml
:
private async void GoToLink(object sender, EventArgs e)
{
IsBrowserOpened= true;
await Browser.OpenAsync($"https://website.com/");
}
protected override void OnDisappearing()
{
base.OnDisappearing();
if (IsBrowserOpened)
{
MessagingCenter.Send(this, "updateFromBrowser", 1);
}
}
Home.xaml
Страница
public partial class Home : ContentPage
{
public Home()
{
InitializeComponent();
MessagingCenter.Subscribe<ItemDetailPage, int>(this, "updateFromBrowser", async (obj, item) =>
{
// Update home page for incoming new data
});
}
}