Как вы переключаетесь между страницами в Xamarin Forms?
Моя главная страница - ContentPage, и я не хочу переключаться на что-то вроде страницы с вкладками.
Я смог сделать это псевдо, найдя родителей элементов управления, которые должны запускать новую страницу, пока я не найду ContentPage, а затем поменяю Content на элементы управления для новой страницы. Но это кажется действительно небрежным.
xamarin
xamarin.forms
Эрик
источник
источник
Ответы:
Xamarin.Forms
поддерживает несколько встроенных узлов навигации:NavigationPage
, где открывается следующая страница,TabbedPage
, тот, который тебе не нравитсяCarouselPage
, что позволяет переключаться влево и вправо на следующие / предыдущие страницы.Вдобавок ко всему, все страницы также поддерживают,
PushModalAsync()
что просто вставляет новую страницу поверх существующей.В самом конце, если вы хотите убедиться, что пользователь не может вернуться на предыдущую страницу (с помощью жеста или аппаратной кнопки «Назад»), вы можете оставить то же самое
Page
и заменить егоContent
.Предлагаемые варианты замены корневой страницы также работают, но вам придется обрабатывать это по-разному для каждой платформы.
источник
В классе App вы можете установить MainPage на страницу навигации и установить корневую страницу на ContentPage:
Затем в вашем первом вызове ContentPage:
источник
Android.Content.Res
для навигации. Это кажется неправильным, откуда мне его импортировать?Если ваш проект настроен как проект форм PCL (и, скорее всего, также как общие формы, но я этого не пробовал), существует класс App.cs, который выглядит следующим образом:
вы можете изменить
GetMainPage
метод, чтобы вернуть новую TabbedPaged или другую страницу, которую вы определили в проекте.Оттуда вы можете добавлять команды или обработчики событий для выполнения кода и выполнения
источник
Navigation
в этом примере? - Это вы где-то создали? - Я не вижу этого в этом примере кода.PushAsync()
у меня не работал, аPushModalAsync()
работалПоместите новую страницу в стопку, затем удалите текущую страницу. Это приводит к переключению.
Сначала вам нужно перейти на страницу навигации:
Переключение контента не идеально, поскольку у вас есть только одна большая страница и один набор событий страницы, таких как OnAppearing и т. Д.
источник
Navigation.RemovePage();
не поддерживается на Android.await Navigation.PushAsync(new SecondPage(),false);
Если вы не хотите переходить на предыдущую страницу, то есть не позволяете пользователю вернуться к экрану входа в систему после завершения авторизации, вы можете использовать;
Если вы хотите включить функцию возврата, просто используйте
источник
Похоже, эта ветка очень популярна, и будет грустно не упомянуть здесь, что есть альтернативный способ -
ViewModel First Navigation
. Большинство фреймворков MVVM используют его, однако, если вы хотите понять, о чем он, продолжайте читать.Вся официальная документация Xamarin.Forms демонстрирует простое, но немного не чистое решение MVVM. Это потому, что
Page
(View) ничего не должен знать оViewModel
и наоборот. Вот отличный пример этого нарушения:Если у вас есть двухстраничное приложение, этот подход может вам подойти. Однако, если вы работаете над большим корпоративным решением, вам лучше выбрать
ViewModel First Navigation
подход. Это немного более сложный, но гораздо более понятный подход, который позволяет вам перемещатьсяViewModels
междуPages
(представлениями), а не между ними . Одним из преимуществ помимо четкого разделения задач является то, что вы можете легко передать параметры следующемуViewModel
или выполнить асинхронный код инициализации сразу после навигации. Теперь к деталям.(Я постараюсь максимально упростить все примеры кода).
1. Прежде всего нам нужно место, где мы могли бы зарегистрировать все наши объекты и, при желании, определить их время жизни. Для этого мы можем использовать контейнер IOC, вы можете выбрать его сами. В этом примере я буду использовать Autofac (это один из самых быстрых доступных). Мы можем сохранить ссылку на него в,
App
чтобы он был доступен глобально (не очень хорошая идея, но необходима для упрощения):2. Нам понадобится объект, ответственный за получение
Page
(View) для конкретногоViewModel
и наоборот. Второй случай может быть полезен в случае установки корневой / главной страницы приложения. Для этого мы должны договориться о простом соглашении, согласно которому все объектыViewModels
должны находиться вViewModels
каталоге, аPages
(представления) должны находиться вViews
каталоге. Другими словами, онViewModels
должен находиться в[MyApp].ViewModels
пространстве имен, аPages
(Представления) - в[MyApp].Views
пространстве имен. В дополнение к этому мы должны согласиться, чтоWelcomeView
(Страница) должна иметьWelcomeViewModel
и т.д. Вот пример кода преобразователя:3. В случае установки корневой страницы нам понадобится что-то вроде того,
ViewModelLocator
что установитBindingContext
автоматически:4.Наконец, нам понадобится
NavigationService
поддерживающийViewModel First Navigation
подход:Как вы можете видеть, существует
BaseViewModel
абстрактный базовый класс для всех,ViewModels
где вы можете определять такие методы,InitializeAsync
которые будут выполняться сразу после навигации. А вот пример навигации:Как вы понимаете, этот подход более сложен, труднее отлаживать и может сбивать с толку. Однако есть много преимуществ, плюс вам на самом деле не нужно реализовывать это самостоятельно, поскольку большинство фреймворков MVVM поддерживают его из коробки. Демонстрируемый здесь пример кода доступен на github .
Есть много хороших статей о
ViewModel First Navigation
подходе, и есть бесплатная электронная книга Enterprise Application Patterns с использованием Xamarin.Forms, в которой подробно объясняется эта и многие другие интересные темы.источник
Используя метод PushAsync (), вы можете нажимать, а PopModalAsync () вы можете вставлять страницы в стек навигации и из него. В моем примере кода ниже у меня есть страница навигации (корневая страница), и с этой страницы я нажимаю страницу содержимого, которая является страницей входа, как только я завершу свою страницу входа, я возвращаюсь на корневую страницу
~~~ Навигацию можно рассматривать как стек объектов страницы «последним вошел - первым ушел». Для перехода с одной страницы на другую приложение помещает новую страницу в этот стек. Чтобы вернуться на предыдущую страницу, приложение вытолкнет текущую страницу из стека. Эта навигация в Xamarin.Forms обрабатывается интерфейсом INavigation.
Xamarin.Forms имеет класс NavigationPage, который реализует этот интерфейс и будет управлять стеком страниц. Класс NavigationPage также добавит панель навигации в верхнюю часть экрана, которая отображает заголовок, а также будет иметь соответствующую платформу кнопку Назад, которая вернет на предыдущую страницу. Следующий код показывает, как обернуть NavigationPage вокруг первой страницы в приложении:
Ссылку на содержимое, перечисленное выше, и ссылку, которую следует просмотреть для получения дополнительных сведений о формах Xamarin, см. В разделе «Навигация»:
http://developer.xamarin.com/guides/cross-platform/xamarin-forms/introduction-to-xamarin-forms/
~~~
// Удален код для простоты, отображается только поп
источник
Переход с одной страницы на другую в Xamarin.forms с использованием свойства Navigation Ниже образца кода
Для перехода с одной страницы на другую с помощью ячейки просмотра Ниже кода Xamrian.forms
Пример как ниже
источник
Вызов:
Создайте этот метод внутри App.xaml.cs:
источник
Если вы хотите перейти с YourPage на следующую страницу, вы делаете:
Вы можете узнать больше о навигации Xamarin Forms здесь: https://docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/navigation/hierarchical
У Microsoft есть неплохие документы по этому поводу.
Существует также более новая концепция
Shell
. Это позволяет по-новому структурировать ваше приложение и в некоторых случаях упрощает навигацию.Введение: https://devblogs.microsoft.com/xamarin/shell-xamarin-forms-4-0-getting-started/
Видео по основам Shell: https://www.youtube.com/watch?v=0y1bUAcOjZY&t=3112s
Документы: https://docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/shell/
источник
Страница XAML добавить это
на странице CS
источник
После
PushAsync
использованияPopAsync
(сthis
) для удаления текущей страницы.источник
В Xamarin у нас есть страница NavigationPage. Он содержит стек ContentPages. NavigationPage имеет такие методы, как PushAsync () и PopAsync (). PushAsync добавляет страницу вверху стека, тогда эта страница станет активной в данный момент. PopAsync () удаляет страницу из вершины стека.
В App.Xaml.Cs мы можем установить как.
MainPage = новая страница навигации (новая ваша страница ());
ждать Navigation.PushAsync (новый newPage ()); этот метод добавит newPage наверху стека. В это время активной страницей будет nePage.
источник