¿Cómo se cambia entre páginas en Xamarin Forms?
Mi página principal es ContentPage y no quiero cambiar a algo como una página con pestañas.
Pude pseudohacerlo al encontrar los padres de los controles que deberían activar la nueva página hasta que encuentre ContentPage y luego cambie el Contenido con controles para una nueva página. Pero esto parece realmente descuidado.
xamarin
xamarin.forms
Eric
fuente
fuente
Respuestas:
Xamarin.Forms
admite varios hosts de navegación integrados:NavigationPage
, donde se desliza la página siguiente,TabbedPage
, el que no te gustaCarouselPage
, que permite cambiar de izquierda a derecha a la página siguiente / anterior.Además de esto, todas las páginas también son compatibles con lo
PushModalAsync()
que simplemente empuja una nueva página sobre la existente.Al final, si desea asegurarse de que el usuario no pueda volver a la página anterior (mediante un gesto o el botón de hardware Atrás), puede mantener la misma
Page
visualización y reemplazarlaContent
.Las opciones sugeridas para reemplazar la página raíz también funcionan, pero tendrás que manejarlas de manera diferente para cada plataforma.
fuente
En la clase Aplicación, puede configurar MainPage en una página de navegación y configurar la página raíz en su ContentPage:
Luego, en su primera llamada de ContentPage:
fuente
Android.Content.Res
para la navegación. Eso no parece correcto, ¿de dónde tengo que importarlo?Si su proyecto se ha configurado como un proyecto de formularios PCL (y muy probablemente también como formularios compartidos, pero no lo he probado), hay una clase App.cs que se ve así:
puede modificar el
GetMainPage
método para devolver un nuevo TabbedPaged o alguna otra página que haya definido en el proyectoA partir de ahí, puede agregar comandos o controladores de eventos para ejecutar código y hacer
fuente
Navigation
en este ejemplo? - ¿Es un objeto que creaste en alguna parte? - No lo veo en este ejemplo de código.PushAsync()
no funcionó para mí, mientras quePushModalAsync()
síInserte una nueva página en la pila y luego elimine la página actual. Esto resulta en un cambio.
Primero debe estar en una página de navegación:
Cambiar contenido no es ideal ya que solo tiene una página grande y un conjunto de eventos de página como OnAppearing, etc.
fuente
Navigation.RemovePage();
no es compatible con Android.await Navigation.PushAsync(new SecondPage(),false);
Si no desea ir a la página anterior, es decir, no permita que el usuario regrese a la pantalla de inicio de sesión una vez que se haya realizado la autorización, puede usar;
Si desea habilitar la funcionalidad de retroceso, simplemente use
fuente
Parece que este hilo es muy popular y será triste no mencionar aquí que hay una forma alternativa -
ViewModel First Navigation
. La mayoría de los frameworks MVVM lo usan, sin embargo, si quieres entender de qué se trata, continúa leyendo.Toda la documentación oficial de Xamarin.Forms está demostrando una solución simple, aunque un poco no MVVM pura. Esto se debe a que
Page
(View) no debería saber nada sobre elViewModel
y viceversa. Aquí hay un gran ejemplo de esta violación:Si tiene una aplicación de 2 páginas, este enfoque puede ser bueno para usted. Sin embargo, si está trabajando en una gran solución empresarial, será mejor que adopte un
ViewModel First Navigation
enfoque. Es un enfoque un poco más complicado pero mucho más limpio que le permite navegar entre enViewModels
lugar de navegar entrePages
(Vistas). Una de las ventajas, además de una clara separación de preocupaciones, es que puede pasar fácilmente parámetros al siguienteViewModel
o ejecutar un código de inicialización asincrónico justo después de la navegación. Ahora a los detalles.(Intentaré simplificar todos los ejemplos de código tanto como sea posible).
1. En primer lugar, necesitamos un lugar donde podamos registrar todos nuestros objetos y, opcionalmente, definir su vida útil. Para este asunto podemos usar un contenedor IOC, puede elegir uno usted mismo. En este ejemplo usaré Autofac (es uno de los más rápidos disponibles). Podemos mantener una referencia a él
App
para que esté disponible a nivel mundial (no es una buena idea, pero es necesaria para simplificar):2. Necesitaremos un objeto responsable de recuperar una
Page
(Vista) para una específicaViewModel
y viceversa. El segundo caso puede ser útil en caso de configurar la página raíz / principal de la aplicación. Para eso, deberíamos acordar una convención simple de que todosViewModels
deberían estar en elViewModels
directorio yPages
(Vistas) deberían estar en elViews
directorio. En otras palabras,ViewModels
debería vivir en el[MyApp].ViewModels
espacio de nombres yPages
(Vistas) en el[MyApp].Views
espacio de nombres. Además de eso, deberíamos estar de acuerdo en queWelcomeView
(Página) debería tener unWelcomeViewModel
y etc. Aquí hay un ejemplo de código de un mapeador:3.Para el caso de configurar una página raíz, necesitaremos algo
ViewModelLocator
que estableceráBindingContext
automáticamente:Finalmente, necesitaremos un enfoque
NavigationService
que apoyeViewModel First Navigation
:Como puede ver, hay una
BaseViewModel
clase base abstracta para todos losViewModels
métodos donde puede definir métodosInitializeAsync
que se ejecutarán inmediatamente después de la navegación. Y aquí hay un ejemplo de navegación:Como comprenderá, este enfoque es más complicado, más difícil de depurar y puede resultar confuso. Sin embargo, hay muchas ventajas, además de que en realidad no tiene que implementarlo usted mismo, ya que la mayoría de los marcos MVVM lo admiten desde el primer momento. El ejemplo de código que se muestra aquí está disponible en github .
Hay muchos buenos artículos sobre el
ViewModel First Navigation
enfoque y hay un libro electrónico gratuito de patrones de aplicación empresarial que usa Xamarin.Forms eBook que explica este y muchos otros temas interesantes en detalle.fuente
Al usar el método PushAsync (), puede empujar y PopModalAsync () puede abrir páginas hacia y desde la pila de navegación. En mi ejemplo de código a continuación, tengo una página de navegación (página raíz) y desde esta página presiono una página de contenido que es una página de inicio de sesión una vez que he completado mi página de inicio de sesión, vuelvo a la página raíz
~~~ La navegación se puede considerar como una pila de objetos Page de último en entrar, primero en salir. Para pasar de una página a otra, una aplicación colocará una nueva página en esta pila. Para volver a la página anterior, la aplicación sacará la página actual de la pila. Esta navegación en Xamarin.Forms es manejada por la interfaz INavigation
Xamarin.Forms tiene una clase NavigationPage que implementa esta interfaz y administrará la pila de Pages. La clase NavigationPage también agregará una barra de navegación en la parte superior de la pantalla que muestra un título y también tendrá un botón Atrás apropiado para la plataforma que regresará a la página anterior. El siguiente código muestra cómo ajustar una NavigationPage alrededor de la primera página de una aplicación:
Referencia al contenido enumerado anteriormente y un vínculo que debe revisar para obtener más información sobre Xamarin Forms, consulte la sección de navegación:
http://developer.xamarin.com/guides/cross-platform/xamarin-forms/introduction-to-xamarin-forms/
~~~
// Se eliminó el código para simplificar, solo se muestra el pop
fuente
Navegación de una página a otra en Xamarin.forms usando la propiedad Navigation debajo del código de ejemplo
Para navegar de una página a otra página con la celda de vista debajo del código Xamrian.forms
Ejemplo como el siguiente
fuente
Llamada:
Crea este método dentro de App.xaml.cs:
fuente
Cuando desee navegar desde YourPage a la página siguiente, debe:
Puede leer más sobre la navegación de Xamarin Forms aquí: https://docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/navigation/hierarchical
Microsoft tiene bastante buena documentación sobre esto.
También existe el concepto más nuevo de
Shell
. Permite una nueva forma de estructurar su aplicación y simplifica la navegación en algunos casos.Introducción: https://devblogs.microsoft.com/xamarin/shell-xamarin-forms-4-0-getting-started/
Video sobre los conceptos básicos de Shell: https://www.youtube.com/watch?v=0y1bUAcOjZY&t=3112s
Documentos: https://docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/shell/
fuente
Página XAML agregar esto
en la página de CS
fuente
Después de
PushAsync
usarPopAsync
(conthis
) para eliminar la página actual.fuente
En Xamarin tenemos una página llamada NavigationPage. Tiene pila de ContentPages. NavigationPage tiene métodos como PushAsync () y PopAsync (). PushAsync agrega una página en la parte superior de la pila, en ese momento esa página se convertirá en la página actualmente activa. El método PopAsync () elimina la página de la parte superior de la pila.
En App.Xaml.Cs podemos configurar como.
MainPage = new NavigationPage (nueva YourPage ());
aguardar Navigation.PushAsync (new newPage ()); este método agregará newPage en la parte superior de la pila. En este momento, nePage será la página activa.
fuente