Il existe deux bonnes façons de procéder: 1) un service de dialogue (facile, propre) et 2) une vue assistée. L'aide assistée fournit quelques fonctionnalités intéressantes, mais cela n'en vaut généralement pas la peine.
SERVICE DE DIALOGUE
a) une interface de service de dialogue comme via un constructeur ou un conteneur de dépendance:
interface IDialogService
{
Task ShowDialogAsync(DialogViewModel dlgVm);
}
b) Votre implémentation de IDialogService devrait ouvrir une fenêtre (ou injecter un certain contrôle dans la fenêtre active), créer une vue correspondant au nom du type dlgVm donné (utiliser l'enregistrement ou la convention de conteneur ou un ContentPresenter avec le type DataTemplates associé). ShowDialogAsync doit créer un TaskCompletionSource et renvoyer sa propriété .Task. La classe DialogViewModel elle-même a besoin d'un événement que vous pouvez invoquer dans la classe dérivée lorsque vous souhaitez fermer et regarder dans la vue de dialogue pour fermer / masquer réellement la boîte de dialogue et terminer la TaskCompletionSource.
b) Pour l'utiliser, appelez simplement wait this.DialogService.ShowDialog (myDlgVm) sur votre instance d'une classe dérivée de DialogViewModel. Après avoir attendu les retours, regardez les propriétés que vous avez ajoutées sur votre machine virtuelle de dialogue pour déterminer ce qui s'est passé; vous n'avez même pas besoin d'un rappel.
VOIR ASSISTÉ
Cela vous permet d'écouter un événement sur le modèle d'affichage. Tout cela pourrait être enveloppé dans un comportement Blend pour éviter le code et l'utilisation des ressources si vous êtes si enclin (FMI, sous-classe la classe "Behavior" pour voir une sorte de propriété attachée Blendable sur les stéroïdes). Pour l'instant, nous allons le faire manuellement sur chaque vue:
a) Créez un OpenXXXXXDialogEvent avec une charge utile personnalisée (une classe dérivée de DialogViewModel).
b) Demandez à la vue de s'abonner à l'événement dans son événement OnDataContextChanged. Assurez-vous de masquer et de vous désabonner si l'ancienne valeur! = Null et dans l'événement Unloaded de la fenêtre.
c) Lorsque l'événement se déclenche, demandez à la vue d'ouvrir votre vue, qui peut se trouver dans une ressource sur votre page, ou vous pouvez la localiser par convention ailleurs (comme dans l'approche du service de dialogue).
Cette approche est plus flexible, mais nécessite plus de travail à utiliser. Je ne l'utilise pas beaucoup. Le seul avantage est la possibilité de placer la vue physiquement à l'intérieur d'un onglet, par exemple. J'ai utilisé un algorithme pour le placer dans les limites du contrôle utilisateur actuel, ou s'il n'est pas assez grand, parcourir l'arborescence visuelle jusqu'à ce qu'un conteneur assez grand soit trouvé.
Cela permet aux boîtes de dialogue d'être proches de l'endroit où elles sont réellement utilisées, atténuer uniquement la partie de l'application liée à l'activité en cours, et permettre à l'utilisateur de se déplacer dans l'application sans avoir à repousser manuellement les boîtes de dialogue, même en ayant plusieurs quasi- les boîtes de dialogue modales s'ouvrent sur différents onglets ou sous-vues.