Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Esta parte del tutorial agrega la parte final a la aplicación, la navegación entre la página de todas las notas y la página de notas individuales.
Antes de escribir cualquier código para controlar la navegación desde la aplicación, vamos a describir el comportamiento de navegación esperado.
En AllNotesPage, hay la colección de notas existentes y un botón Nueva nota .
- Al hacer clic en una nota existente, debe ir a la página de notas y cargar la nota en la que se hizo clic.
- Al hacer clic en el botón Nueva nota , debe ir a la página de notas y cargar una nota vacía y no guardada.
En la página de la nota, añadirá un botón Atrás y hay botones Guardar y Eliminar.
- Al hacer clic en el botón Atrás, se debe volver a la página de todas las notas y descartar los cambios realizados en la nota.
- Al hacer clic en el botón Eliminar , debe eliminar la nota y, a continuación, volver a navegar.
Nueva nota
En primer lugar, gestionarás la navegación de una nueva nota.
Sugerencia
Puede descargar o ver el código de este tutorial desde el repositorio GitHub. Para ver el código tal como está en este paso, consulte este commit: navigation - nueva nota.
En AllNotesPage.xaml, busque el
AppBarButtonpara una nota nueva.Agregue un
Clickcontrolador de eventos y cámbielo porNewNoteButton_Click. (Consulte Agregar manejadores de eventos en el paso de la página de notas si necesita un recordatorio de cómo hacer esto).<AppBarButton Icon="Add" Label="New note" Click="NewNoteButton_Click"/>En el
NewNoteButton_Clickmétodo (en AllNotesPage.xaml.cs), agregue este código:private void NewNoteButton_Click(object sender, RoutedEventArgs e) { // ↓ Add this. ↓ Frame.Navigate(typeof(NotePage)); }
Cada página tiene una propiedad Marco que proporciona una referencia a la instancia Marco a la que Page pertenece (si existe). Es el Frame que se llama al método Navigate aquí. El Navigate método toma el tipo de la página a la que desea navegar. Puede obtener eso Type en C# usando el operador typeof.
Si ejecuta la aplicación ahora, puede hacer clic en el botón Nueva nota para ir a la página de notas y puede escribir en el editor de notas. Sin embargo, si intenta guardar la nota, no ocurrirá nada. Esto se debe a que todavía no se ha creado una instancia del Note modelo en la página de notas. Lo harás ahora.
Abra NotePage.xaml.cs.
Agregue código para invalidar el método OnNavigatedTo de la página.
public NotePage() { this.InitializeComponent(); } // ↓ Add this. ↓ protected override void OnNavigatedTo(NavigationEventArgs e) { base.OnNavigatedTo(e); noteModel = new Note(); }
Ahora, al navegar a NotePage, se crea una nueva instancia del Note modelo.
Notas existentes
Ahora vas a agregar navegación a las notas existentes. Actualmente, cuando haces clic en la nota de ItemsView, la nota se selecciona, pero no sucede nada. El comportamiento predeterminado para la mayoría de los controles de recopilación es una sola selección, lo que significa que se selecciona un elemento a la vez. Actualizarás el ItemsView para que, en lugar de seleccionarlo, puedas hacer clic en un elemento como un botón.
Sugerencia
Puede descargar o ver el código de este tutorial desde el repositorio GitHub. Para ver el código tal como está en este paso, consulte este commit navigation - aplicación final.
Abra AllNotesPage.xaml.
Actualice el XAML para
ItemsViewcon SelectionMode = None y IsItemInvokedEnabled =True.Agregue un controlador para el evento ItemInvoked .
<ItemsView ItemsSource="{x:Bind notesModel.Notes}" Grid.Row="1" Margin="24" ItemTemplate="{StaticResource NoteItemTemplate}" <!-- ↓ Add this. ↓ --> SelectionMode="None" IsItemInvokedEnabled="True" ItemInvoked="ItemsView_ItemInvoked">En AllNotesPage.xaml.cs, busque el
ItemsView_ItemInvokedmétodo . (Si Visual Studio no lo creó automáticamente, lo que podría ocurrir si copia y pega el código, agréguelo en el paso siguiente).En el
ItemsView_ItemInvokedmétodo , agregue código para ir aNotePage. Esta vez, usará una sobrecarga del método Navigate que le permite pasar un objeto a la otra página. Pase el invocadoNotecomo segundo parámetro de navegación.private void ItemsView_ItemInvoked(ItemsView sender, ItemsViewItemInvokedEventArgs args) { Frame.Navigate(typeof(NotePage), args.InvokedItem); }Abra NotePage.xaml.cs.
Actualice la sobrescritura del método
OnNavigatedTopara manejar elNoteque se pasa por la llamada aNavigate.protected override void OnNavigatedTo(NavigationEventArgs e) { base.OnNavigatedTo(e); // ↓ Update this. ↓ if (e.Parameter is Note note) { noteModel = note; } else { noteModel = new Note(); } // ↑ Update this. ↑ }En este código, primero comprobará si el parámetro pasado es un
Noteobjeto . Si es así, se le asigna como modeloNotepara la página. Si esnullo no es unNote, cree un nuevoNotecomo antes.
Navegación hacia atrás
Por último, debe actualizar la aplicación para que pueda volver desde una nota individual a la página de todas las notas.
El control TitleBar de WinUI 3 incluye un botón Atrás que cumple todas las directrices de Fluent Design para la ubicación y apariencia. Usará este botón integrado para la navegación hacia atrás.
Abra MainWindow.xaml.
Actualice el XAML para
TitleBarcon IsBackButtonVisible =True, e IsBackButtonEnabled enlazado a la propiedad Frame.CanGoBack.Agregue un controlador para el evento BackRequested . El XAML debe tener este aspecto:
<TitleBar x:Name="AppTitleBar" Title="WinUI Notes" IsBackButtonVisible="True" IsBackButtonEnabled="{x:Bind rootFrame.CanGoBack, Mode=OneWay}" BackRequested="AppTitleBar_BackRequested">Aquí, la propiedad IsBackButtonVisible se establece en
true. Esto hace que el botón Atrás aparezca en la esquina superior izquierda de la ventana de la aplicación.A continuación, la propiedad IsBackButtonEnabled está enlazada a la propiedad Frame.CanGoBack , por lo que el botón Atrás solo se habilita si el marco puede navegar hacia atrás.
Por último, se agrega el controlador de eventos BackRequested . Aquí es donde pones el código para volver.
En MainWindow.xaml.cs, agregue este código al
AppTitleBar_BackRequestedmétodo :private void AppTitleBar_BackRequested(TitleBar sender, object args) { // ↓ Add this. ↓ if (rootFrame.CanGoBack == true) { rootFrame.GoBack(); } // ↑ Add this. ↑ }La
Frameclase realiza un seguimiento de la navegación en su BackStack, por lo que puede volver a las páginas anteriores simplemente llamando al método GoBack . Es un procedimiento recomendado comprobar siempre la propiedad CanGoBack antes de llamar aGoBack.
A continuación, debe actualizar el código en NotePage para navegar de regreso después de eliminar la nota.
Abra NotePage.xaml.cs.
Actualice el
DeleteButton_Clickmétodo del controlador de eventos con una llamada alFrame.CanGoBackmétodo después de eliminar la nota:private async void DeleteButton_Click(object sender, RoutedEventArgs e) { if (noteModel is not null) { await noteModel.DeleteAsync(); } // ↓ Add this. ↓ if (Frame.CanGoBack == true) { Frame.GoBack(); } // ↑ Add this. ↑ }
Sugerencia
Es posible que haya observado que en NotePage llamó a Frame.GoBack, mientras que en MainWindow llamó a rootFrame.GoBack. Esto se debe a que la clase Page tiene una propiedad Frame que obtiene el Frame que está hospedando el Page, si existe. En este caso, obtiene una referencia a rootFrame.
Ahora, puedes ejecutar la aplicación. Intenta agregar nuevas notas, navegar hacia atrás y hacia delante entre notas, y eliminar notas.
Obtenga más información en los documentos:
- Implementación de la navegación entre dos páginas
- Historial de navegación y navegación hacia atrás
- Frame Class, Page Class
Pasos siguientes
¡Felicidades! Ha completado el tutorial Creación de una aplicación WinUI .
Los vínculos siguientes proporcionan más información sobre cómo crear aplicaciones con WinUI y el Windows App SDK: