03. Fonctionnalités avancées

Pour rappel, voici la liste des articles qui constituent cette série d'articles :

1. Pré-Navigation & Annulation de la navigation

1.1 Pré-Navigation
Si l'on souhaite effectuer un traitement avant chaque navigation vers une page, Navegar permet de définir une fonction de pré-navigation qui sera systématiquement appelé à chaque appel de la fonction NavigateTo. Si vous souhaitez définir cette fonction vous devez l'associer à la classe de navigation de la façon suivante (toujours aprés l'initialisation de la classe de navigation dans la fonction OnLaunched du fichier App.xaml.cs) :

SimpleIoc.Default.GetInstance<INavigation>().PreviewNavigate += PreviewNavigate;

PreviewNavigate est donc la fonction vous permettant de définir le traitement que vous souhaitez effectuer. Voici une définition de cette fonction :

/// <summary>
/// Permet d'effectuer une action avant chaque navigation
/// </summary>
/// <param name="currentViewModelInstance">Instance du ViewModel courant</param>
/// <param name="currentViewModel">Type du ViewModel courant</param>
/// <param name="viewModelToNavigate">Type du ViewModel vers lequel la navigation est dirigée</param>
/// <returns>Un booléen indiquant si la navigation doit être poursuivi ou non</returns>
private bool PreviewNavigate(ViewModelBase currentViewModelInstance, Type currentViewModel, Type viewModelToNavigate)
{
    //Vérification du type de Viewmodel vers lequel la navigation est dirigée pour au moins naviguer vers la premiére page
    if (viewModelToNavigate != typeof(LandingPageViewModel))
    {
        return UsersController.IsConnected;    
    }
    return true;
}

Comme vous pouvez le voir la fonction définie 3 paramétres et 1 paramétre de sortie dont voici le détail :
  • ViewModelBase currentViewModelInstance permet de récupérer l'instance du ViewModel courant
  • Type currentViewModel type du ViewModel courant
  • Type viewModelToNavigate type du ViewModel vers lequel la navigation va être dirigée
  • Le paramétre de sortie, de type booléen, permet d'indiquer que la navigation doit être poursuivie ou non

Toute définition de cette fonction doit donc renvoyer un booléen pour indique ce que Navegar doit faire.

1.2 Annulation de la navigation
Si vous avez bien suivi l'explication du point précédent, lorsque la fonction de pré-navigation renvoie false, Navegar va annuler la navigation qui devait être effectuer. Afin de pouvoir contrôler cette navigation, un évenement est levé par Navegar, vous devez donc vous y abonner de la façon suivante (toujours aprés l'initialisation de la classe de navigation dans la fonction OnLaunched du fichier App.xaml.cs) :

    SimpleIoc.Default.GetInstance<INavigation>().NavigationCanceledOnPreviewNavigate += OnNavigationCanceledOnPreviewNavigate;

Voici une définition de cette fontion :
            
            /// <summary>
            /// Se déclenche lorsque la pré-navigation a échoué car la fonction identifiée n'est pas satisfait aux condiditions
            /// </summary>
            private void OnNavigationCanceledOnPreviewNavigate(object sender, EventArgs args)
            {
                //On revient à l'écran de login
                SimpleIoc.Default.GetInstance<INavigation>().Clear();
                SimpleIoc.Default.GetInstance<INavigation>().NavigateTo<LandingpageViewModel>(true);
            }

Si nous détaillons cette fonction nous pouvons voir que Naevgar permet d'annuler la pile de navigation avec la fonction Clear afin de ne pas pouvoir revenir en arriére tant qu'une nouvelle navigation n'est pas enclenchée. Puis nous naviguons vers la page de login, car dans l'exemple il s'agissait de vérifier que l'utilisateur est toujours connecté.

Vous pouvez tester cette pré-navigation et l'annulation en modifiant la fonction OpenClient du ViewModel ListClientsPageViewModel en décommentant la ligne : //UsersController.IsConnected = false;>


2. Type de ViewModel courant
Navegar vous permeté également de connaitre à un instant T le ViewModel courant au sein de la navigation, en utilisant la fonction GetViewModelCurrent. Ceci peut par exemple être utilisé lors la sortie d'un état de suspension de l'application pour éffectuer un traitment particulier. En voici un exemple :
            
        /// <summary>
        /// Permet de gérer la sortie de l'état suspendu de l'application
        /// </summary>
        private void OnResuming(object sender, object e)
        {
            if (SimpleIoc.Default.GetInstance<INavigation>().GetViewModelCurrent().GetType() != typeof(ListClientsPageViewModel))
            {
                //On supprime l'historique de navigation et on revient vers la page de la liste des clients (pour l'exemple)
                SimpleIoc.Default.GetInstance<INavigation>().Clear();
                SimpleIoc.Default.GetInstance<INavigation>().NavigateTo<ListClientsPageViewModel>(true);
            }
        }

On peut voir ici que lorsque l'application reprend le premier plan, la pile de navigation est annulée et est redirigée vers la page de la liste des clients.
3. Exceptions
Navegar peut potentiellement lever 4 exceptions que vous pouvez contrôler :
  • FrameNavigationException est levée lorsqu'une erreur se produit dans la gestion des Frames de WinRT
  • FunctionToLoadNavigationExceptionest levée lorsque Navegar ne peut pas trouver la fonction ou le constructeur demandé lors de la navigation. Cela peut être dû à un mauvais passage de paramètres (mauvais types ou nombre ne satisfaisant pas la définition voulue de la fonction ou du constructeur)
  • HistoryNavigationException est levée lorsqu'une incohérence se produit entre la pile de navigation des ViewModel et des Frames
  • ViewModelHistoryTypeException est levée si le ViewModel vers lequel la navigation est effectuée n'hérite pas de ViewModelBase de Mvvm Light


Nous voila arriver au terme des cette petite série d'articles sur Navegar. J'espére que vous savez à présent naviguer au sein d'une application avec Navegar. N'hésitez pas à consulter les exemples fournis dans le code source de Navegar. Pour cela rendez-vous sur la page codeplex : navegar.codeplex.com

// coding with fun

2 commentaires

  1. Ꮃow, that's what I was seɑrching for, what a stuff! present here at this blog, thanks admin of this site.

  2. Aw, thіs was a very goߋd post. Taking a fеw minutes аnd actual effort to create a very gоod article… but whаt can I say… I hesitate a lot
    and never manage to get nearly anythіng done.

Écrire un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec une *

Quelle est la quatrième lettre du mot zvplj ? :