(извините, если вопрос глупый или уже задавался ранее)
Я новичок в .NET MAUI и пытаюсь создать приложение, и у меня есть этот код:
private async void BtnOptionsClicked(object sender, EventArgs e)
{
OptionsPage optPage = new();
NavigationPage navPage = new(optPage)
{
Title = optPage.Title
};
navPage.ToolbarItems.Add(new ToolbarItem("BackButtonPlaceholder", "", async () =>
{
System.Diagnostics.Debug.WriteLine("Back button pressed");
await Navigation.PopAsync();
}));
await Navigation.PushAsync(navPage);
}
Я пытаюсь добавить кнопку «Назад» для определенной страницы, а не для главной страницы.
Проблема в том, что NavigationPage появляется в первый раз и работает, но во второй раз он просто не отображается, только OptionsPage.
Кстати, он отлично работает на Android, но не на Windows (я не могу проверить на других платформах).
Я попытался использовать RemovePage вместо PopAsync и попытался добавить ToolbarItem в класс OptionsPage, ничего из того, что я пробовал, не работает...
Нажать optPage. Не заключайте его во вторую страницу NavigationPage.
Дело в том, что у меня нет другой NavigationPage, я хочу, чтобы только OptionsPage имела NavigationPage, но не страницу, с которой она будет вызываться.
Вы смешиваете Shell и NavigationPage, по умолчанию проект .NET MAUI создается с Shell.
NavigationPage
является иерархическим (вы помещаете/выталкиваете страницы в стек), он проще в использовании и более гибкий, но вы должны управлять всем самостоятельно (например, меню).Shell
- это навигация на основе URI (работает так же, как страницы веб-сайта с такими URL-адресами, как «/users/1/profile»), она поставляется с предварительно разработанным меню (вкладки и всплывающее окно) и позволяет перейти к абсолютному URL-адресу (который не легко с NavigationPage). Он «заменяет» NavigationPage, поскольку он охватывает множество вариантов использования и удаляет много стандартного кода, связанного с навигацией (поэтому он используется по умолчанию).Поскольку Shell основан на NavigationPage, использование методов NavigationPage с Shell не приведет к ошибкам, вы не должны их смешивать (они не предназначены для использования вместе).
Если вы хотите использовать NavigationPage, вы должны изменить ./App.xaml.cs:
public partial class App : Application
{
public App()
{
InitializeComponent();
// Replace :
// MainPage = new AppShell();
// By this :
MainPage = new NavigationPage(new MainPage());
}
}
Теперь вы можете использовать Navigation.PushAsync(page);, объект page должен наследовать ContentPage, а не другой NavigationPage.
Если вы хотите сохранить Shell, прочитайте это и используйте await Shell.Current.GoToAsync("../../route"); для перехода между страницами.
Если у вас уже есть NavigationPage, немного странно помещать в стек еще один NavigationPage