Table des matières
L’application POS permet d’ouvrir un nombre illimité de vues qui sont en modes différents (vue de base, modale ou vue de message), mais à un moment donné seule une vue de chaque groupe peut être active. Les autres vues ouvertes sont définies comme inactives. À tout moment, lorsqu’une vue de base quelconque est affichée, nous pouvons appeler une fenêtre de changement des vues de base (menu de navigation) afin d’activer une autre vue qui a été ouverte auparavant et qui n’a pas été fermée (elle est devenue inactive). Le menu de navigation ne peut pas être appelé si une vue modale ou une vue de message est ouverte.
Le menu de navigation peut être appelé à l’aide du raccourci clavier CTRL+TAB ou à l’aide du bouton visible dans la section de statut à côté de l’horloge. Dans cette fenêtre, les vues de base ouvertes sont affichées sous forme des mosaïques multi couleurs avec un titre, une icône et/ou une description supplémentaire. Le titre de mosaïque peut être défini à l’aide de la propriété Header dans la classe View ou à l’aide de la propriété SwitchHeader dans le viewmodel (si l’on veut qu’il soit différent de l’en-tête de la vue). L’icône et la couleur sont définies à l’aide des styles dans le fichier ModernUI.xaml. Leur définition est effectuée de la même façon que la définition de couleur et icône d’une mosaïque enregistrée dans le menu principal. De ce fait, lorsqu’une vue a déjà été enregistrée dans le menu principal, la mosaïque dans le menu de navigation adoptera la même couleur et icône que la mosaïque dans le menu principal, à condition que la valeur de la clé de ressource (le premier argument) utilisée dans la méthode RegisterMenuTile soit identique à la valeur de la propriété HeaderLayoutId dans le code-behind de la vue. Dans notre cas, les noms sont différents, donc il sera nécessaire d’ajouter des lignes supplémentaires dans ModernUI.xaml.
Définition dans ModernUI.xaml de la couleur et de l’icône de mosaïque dans la fenêtre du menu de navigation pour la vue exemplaire OrdersView :
<SolidColorBrush x:Key="OrdersViewId.Default.Background" Color="Red" /> <models:ImageKey x:Key="OrdersViewId.Default.ImageKey" SvgValue="ListIcon" />
Il ne faut pas oublier que dans ce cas, OrderViewId est la valeur attribuée à HeaderLayoutId dans la classe de vue.
En outre, il est également possible d’ajouter une descirption supplémentaire à la mosaïque (comme dans la mosaïque Nouvelle vente sur la capture d’écran en dessus). Ce texte est géré par la propriété SwitchHeader2 dans la classe de viewmodel.
Ouvrir des vues
Les vues peuvent être ouvertes en plusieurs modes (comme une vue de base, vue modale ou vue de message). L’utilisateur décide si une vue donnée doit être ouverte en tant qu’une vue indépendante des autres vues (une position séparée dans la fenêtre du menu de navigation) ou si elle doit être un enfant de la vue actuellement active (pas de nouvelles positions dans le menu de navigation). En ouvrant une vue, nous pouvons définir le paramètre IsPreviewMode (qui ouvre la vue en mode lecture seule où la plupart des contrôles modifiables est automatiquement bloqués) et un nombre illimité de nos propres paramètres.
Les vues peuvent être ouvertes à l’aide des méthodes disponibles dans la classe ViewModelBase, ainsi que dans le service IViewManager. La plus simple façon d’ouvrir une vue de base est d’appeler la méthode OpenView <TView>() où TView est le nom de la classe de vue dont nous voulons ouvrir ou activer, si elle est déjà ouverte. Paramètres supplémentaires :
- isChild (bool) – paramètre définissant si la vue en cours d’ouverture doit être un enfant de la vue actuellement ouverte,
- parameters (NavigationParameters) – paramètre permettant de transmettre au viewmodel de la vue en cours d’ouverture un nombre illimité de paramètres personnalisés,
- isPreviewMode (bool) – paramètre disponible déjà dans le constructeur de viewmodel de la vue en cours d’ouverture (contrairement au parameters qui n’est disponible que dans les méthodes d’initialisation de viewmodel ; pour savoir plus au sujet des méthodes d’initialisation de viewmodel, consultez le chapitre Ordre d’appel des méthodes). Ce paramètre sert à ouvrir la vue en mode d’aperçu (avec une fonctionnalité limitée). S’il est défini comme true, la propriété IsPreviewMode dans la classe ViewModelBase sera définie en mode lecture seule. De plus, si un des contrôles suivants : TextBox, SwitchBox, RadioButton, NumericTextBox, ComboBox, CheckBox de l’espace POS.Presentation.Core sera inclus dans cette vue, il sera activé en mode lecture seule.
Afin d’ouvrir cette vue en mode de vue modale, il faut utiliser la méthode suivante :
OpenModalView<TView>() où TView est le nom de la classe de vue dont nous voulons ouvrir ou activer, si elle est déjà ouverte. Paramètres supplémentaires :
- parameters (NavigationParameters) – par analogie comme pour OpenView
- isPreviewMode (bool) – par analogie comme pour OpenView
La méthode ne possède pas de paramètre isChild, car toutes les vues modales sont ouvertes en mode hiérarchique (elles sont les enfants de la vue qui les a ouvertes). Une exception est le manque de relations entre les types de vues différents. Par exemple, si nous ouvrons une vue modale à partir de la vue de base actuelle, la dépendance parent-child ne sera pas créée.
Afin d’ouvrir une vue en mode de vue de message, il faut exécuter deux étapes. La première est définir dans xaml une vue de l’alignement horizontal :
<core:View x:Class="Comarch.POS.Presentation.Sales.Views.OrdersView" HorizontalAlignment="Stretch" …
La deuxième étape consiste à appeler la méthode :
OpenMessageView<TView>() disponible dans le service ViewManager où TView est le nom de classe de la vue dont nous voulons ouvrir. Comme dans le cas de la vue modale, la relation parent-child est toujours présente, mais la relation entre les différents types de vues est omise. Paramètres supplémentaires :
- parameters (NavigationParameters) – par analogie comme pour OpenView et pour OpenModalView,
- isPreviewMode (bool) – par analogie comme pour OpenView et pour OpenModalView
Si nous voulons afficher uniquement un simple message ou une question avec des boutons quelconques, il suffit d’utiliser le service MonitService. Il met à disposition les méthodes comme :
- ShowInformation – méthode affichant la vue de message avec un contenu quelconque et le bouton OK,
- ShowError – méthode affichant la vue de message avec le contenu d’exception et le bouton OK,
- ShowQuestion – méthode affichant la vue de message avec un contenu quelconque et les boutons décisifs OUI et NON,
- Show – méthode affichant la vue de message avec un contenu quelconque et des boutons d’actions prédéfinis (OK, OUI/NON) ou des boutons personnalisés.
Pour plus d’informations sur les messages, consultez le chapitre Messages dans l’article Notifications et messages.
Fermer des vues
Lorsque les vues sont fermées, nous disposons d’une méthode permettant de fermer la vue actuellement active et d’une méthode de fermeture d’une vue sélectionnée (avec l’option de fermer tous ses ancêtres). Comme dans le cas de l’ouverture d’une vue, lors de la fermeture d’une vue il est également possible d’ajouter des paramètres personnalisés supplémentaires qui seront transmis à la vue qui sera activée après la fermeture de la vue actuelle.
Fermer la vue actuelle active toujours la vue à partir de laquelle la vue en cours de fermeture a été auparavant ouverte. Dans le cas où les vues sont en relation parent-child (lors de l’ourverture d’une vue où IsChild=true), fermer la vue-enfant fait revenir à la vue-parent.
Afin de fermer la vue active, il faut utiliser la méthode :
Dans le viewmodel, il faut appeler la méthode Close() qui appelle directement la méthode CloseView dans le ViewManager en transmettant sa vue en tant que paramètre. La méthode Close ferme toujours la vue associée au viewmodel actuel. Paramètres supplémentaires :
- parameters (NavigationParameters) – paramètre permettant de transmettre les informations de la vue en course de fermeture à la vue qui sera activée
Afin de fermer une vue sélectionnée (active ou inactive), il faut utiliser la méthode :
CloseView() qui est dans le service IViewManager. Paramètres supplémentaires de la méthode :
- view (IView) – paramètre définissant quelle vue sera fermée,
- closeParents (bool) – paramètre définissant si toutes les vues dépendantes dans la relation parent-child doivent être également fermées (les vues ouvertes avec le paramètre IsChild=true). La valeur par défaut est true.
Ordre d’appel des méthodes de navigation
Lors de la navigation entre les vues (ouverture, fermeture, basculer entre les vues actives), des méthodes spéciales sont appelées dans les viewmodels participant dans la navigation. Ces méthodes permettent d’exécuter des actions appropriées, en fonction du fait si la vue est ouverte pour la première fois, réactivée, désactivée ou fermée). Elles fournissent aussi des paramètres qui sont envoyés lors de l’appel des méthodes d’ouverture et de fermeture.
Les méthodes de navigation sont fournies par la classe de base de chaque viewmodel – ViewModelBase. Ce sont les méthodes : OnInitialization, OnActivation, OnActivated, OnDeactivted, Dispose et IsTarget. Des méthodes appropriées sont automatiquement appelées lors du processus de l’ouverture tant sur la vue à partir de laquelle nous ouvrons la nouvelle vue que la vue cible. Dans le cas du processus de la fermeture, des méthodes définies sont appelées sur la vue fermée et sur la vue qui sera activée en résultat de la fermeture de la vue actuelle. Il en va de même pour le passage d’une vue ouverte à une autre. Une question importante est quelles méthodes sont appelées lors d’une navigation particulière et dans quel ordre.
Le processus de l’ouverture, de la fermeture et du passage d’une vue à l’autre est illustré sur le schéma ci-dessous :
Description des méthodes :
- IsTarget (ViewModelBase)
Cette méthode est appelée lors de l’ouverture de vue, avant le constructeur de vue, sur toutes les instances des viewmodels des vues dont le type correspond à la vue en cours d’ouverture. S’il n’existe aucune instance de vue du même type que la vue en cours d’ouverture, alors une nouvelle vue sera créée. S’il existe déjà des vues ouvertes de ce type, la méthode sera appelée sur chaque viewmodel de vue dans l’ordre dans lequel elles ont été ouvertes. Si l’une d’entre elles retourne la valeur true, elle sera activée. En revanche, si aucune vue existante de ce type ne retourne la valeur true, alors une nouvelle instance sera créée.
- OnInitialization (ViewModelBase)
cette méthode est appelée dans le ViewModel uniquement lors de l’ouverture d’une nouvelle vue (nouvelle instance, nouvel onglet). Elle n’a pas d’accès au parent (l’appel ViewManager.GetParentViewModel(this) retourne la valeur null).
Attention : dans cette méthode il ne faut pas ouvrir ni fermer les vues !
- OnActivation (ViewModelBase)
cette méthode est appelée à chaque ouverture de la vue ou à l’activation même. Elle n’a pas d’accès au parent (l’appel ViewManager.GetParentViewModel(this) retourne la valeur null).
Attention : dans cette méthode il ne faut pas ouvrir ni fermer les vues !
- OnActivated (ViewModelBase)
cette méthode est appelée à chaque ouverture de vue ou à l’activation même.
- OnDeactivated (ViewModelBase)
cette méthode est appelée lors de la désactivation ou de la fermeture d’une vue.
- Dispose (ViewModelBase)
cette méthode est appelée uniquement lors de la fermeture de vue. Elle permet de libérer des ressources non-gérables par le Garbage Collector ou d’arrêter les fils-enfants.
- OnApplyViewTemplate (View)
Cette méthode est appelée dans le code-behind de la classe de vue, une seule fois après la création d’une instance de vue et après le chargement de toutes les composantes (contrôles) de vue.