Question WPF et Prism View Overlay


J'ai besoin d'aide pour superposer des vues en utilisant le cadre de prisme. Son un peu plus complexe que cela, laissez-moi vous expliquer. Je pourrais aussi y penser: D

J'ai shell (fenêtre wpf) et j'ai 2 vues (A & B - deux contrôles utilisateur) dans un module. Lorsque le shell le charge, chargez la vue A. Sur la vue A J'ai un bouton pour "afficher" la vue B pour certaines entrées utilisateur. alors naturellement je penserais à une sorte de fenêtre / contrôle modal, peut-être même à un popup. Cependant, le problème que je rencontre avec la fenêtre contextuelle est que lorsque je déplace le shell, la fenêtre contextuelle reste fixe et ne bloque pas les événements dans la vue A. J'ai essayé de désactiver la vue A pour arrêter les événements et j'ai également essayé d'utiliser un déplace la vue B avec la coque. Seule la toile fonctionne mais j'ai maintenant besoin d'un moyen de la bloquer. Y a-t-il un moyen de superposer une vue sur une autre vue avec un prisme? ou comment tout le monde crée-t-il des popups modaux avec prisme & wpf? tout conseil ou conseil serait grandement apprécié.


11
2018-03-19 13:09


origine


Réponses:


Si vous voulez utiliser incorporé boîtes de dialogue sans fenêtre supplémentaire, vous pouvez utiliser RegionManager de Prism pour obtenir le comportement décrit. L'astuce consiste à placer la région PopUp parallèle à votre région principale dans l'arborescence visuelle:

<Grid>
   <ContentControl cal:RegionManager.RegionName="MainRegion" IsEnabled={Binding IsNoPopUpActive} />
   <ContentControl cal:RegionManager.RegionName="PopUpRegion"/>
</Grid>

Utilisez maintenant le RegionManager pour placer la vue "A" dans la "MainRegion". Créez une classe de contrôleur similaire à IPopUpDialogController. Il devrait être responsable de mettre votre vue "B" (ou tout autre PopUpView dans votre application) dans la "PopUpRegion" à la demande. De plus, il devrait contrôler un drapeau qui signale que le "MainRegion" sous-jacent doit être activé ou désactivé. De cette façon, un utilisateur ne pourra pas jouer avec les commandes de votre vue "A" tant que la fenêtre contextuelle ne sera pas fermée.

Cela peut même être fait de manière modale en utilisant ComponentDispatcher.PushModal () avant de pousser une image sur le Dispatcher. Cependant, je recommanderais d'éviter les boîtes de dialogue modales.


Mettre à jour: Comme demandé dans un commentaire, IsNoPopUpActive pourrait être implémenté dans le modèle de vue de sauvegarde. Là, vous pouvez le lier à la collection View de RegionManager pour la région popup:

public bool IsNoPopUpActive 
{ 
    get { return _regionManager.Regions["PopUpRegion"].Views.Count() == 0; }
}

N'oubliez pas de déclencher un événement PropertyChanged dès que vous modifiez la collection de vues (ajouter / supprimer une fenêtre contextuelle).

Juste pour votre information: de nos jours, j'évite de désactiver les commandes en arrière-plan et d'insérer un panneau transparent. Cela évite de cliquer sur les commandes d'arrière-plan. Cependant, cela ne gère pas la saisie au clavier (tabulation vers les contrôles). Pour corriger la saisie au clavier, vous devez vous assurer que le focus du clavier est piégé dans le popup (MSDN sur les concepts WPF Focus).

L'ajout des attributs de focus suivants à la région popup devrait faire l'affaire:

KeyboardNavigation.DirectionalNavigation="None"
KeyboardNavigation.ControlTabNavigation="None"
KeyboardNavigation.TabNavigation="Cycle"
KeyboardNavigation.TabIndex="-1"

14
2018-03-19 15:29



Si vous utilisez WPF + MVVM avec Prism, vous pouvez consulter ce contrôleur de superposition Message View. La bonne partie de cette approche est que vous pouvez écrire des tests unitaires sur votre modèle d'affichage à l'aide d'un contrôleur de superposition et que le contrôleur fictif renvoie le résultat que l'utilisateur choisira dans la superposition.

Vous pouvez le trouver ici: http://presentationlayer.wordpress.com/2011/05/24/wpf-overlay-message-view-controller/

J'espère que cela t'aides


2
2018-05-26 17:08