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, agregará 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, controlará la navegación de una nueva nota.
Sugerencia
Puede descargar o ver el código de este tutorial desde el repositorio de GitHub. Para ver el código tal como está en este paso, consulte esta confirmación: navegación: nueva nota.
En AllNotesPage.xaml, busque una
AppBarButtonnueva nota.Agregue un
Clickcontrolador de eventos y cámbielo porNewNoteButton_Click. (Consulte Agregar controladores de eventos en el paso de la página de notas si necesita un recordatorio sobre cómo hacerlo).<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 Frame que proporciona una referencia a la instancia de Frame a la Page que 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 obtenerlo Type en C# mediante el typeof operador .
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 agregará navegación para las notas existentes. Actualmente, al hacer clic en la nota de ItemsView, se selecciona la nota, 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á para ItemsView que, en lugar de seleccionarlo, puede hacer clic en un elemento como un botón.
Sugerencia
Puede descargar o ver el código de este tutorial desde el repositorio de GitHub. Para ver el código tal como está en este paso, consulte esta confirmación: navegación: aplicación final.
Abra AllNotesPage.xaml.
Actualice el XAML para
ItemsViewcon SelectionMode = None e 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 objeto 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 invalidación del
OnNavigatedTométodo para controlar elNoteque pasa 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 ,Notecree 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 incluye un botón Atrás que cumple todas las directrices de Fluent Design para la colocación y la apariencia. Usará este botón integrado para la navegación hacia atrás.
Abra MainWindow.xaml.
Actualice el XAML para
TitleBarcon IsBackButtonVisible =Truee 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 coloca 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 volver 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, llame 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 objeto que hospeda 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
- Clase Frame, Clase Page
Pasos siguientes
¡Felicidades! Ha completado el tutorial Creación de una aplicación WinUI .
Los vínculos siguientes proporcionan más información sobre la creación de aplicaciones con WinUI y windows App SDK: