2009-06-18 8 views
11

J'ai une application WPF composite. Dans l'un de mes modules, je veux créer un assistant et faire apparaître les étapes dans une région pour pouvoir passer d'une étape à l'autre. À l'origine, cet assistant apparaissait dans une zone de tabulation et la région imbriquée fonctionnait correctement. Maintenant, je veux en faire une boîte de dialogue modale, mais après l'avoir ouverte, la région interne ne sera jamais enregistrée avec le gestionnaire de région; Je ne peux donc pas ajouter mes étapes d'assistant. J'ai eu l'impression que le gestionnaire de région était global, et juste ajouter cal: RegionManager.RegionName = "WizardSteps" le ferait, mais apparemment pas.WPF, Prism v2, Région dans un dialogue modal, ajouter une région dans le code derrière

Si je passe le gestionnaire de la région à la vue que je pourrais être en mesure de l'utiliser ... Est-ce que quelqu'un sait comment ajouter une région à un ContentControl dans le code derrière?

Répondre

17

Le problème est que les régions recherche l'arbre visuel pour la RegionManager propriété attachée, puis se faire enregistrer avec ce gestionnaire. Dans la fenêtre principale c'est bien, mais dans une fenêtre enfant cela ne se produit pas.

Dans le programme d'amorçage, une fois le shell créé, le code suivant est exécuté.

RegionManager.SetRegionManager(shell, this.Container.Resolve<IRegionManager>()); 
RegionManager.UpdateRegions(); 

Pour obtenir le gestionnaire de la région de travailler avec la fenêtre de votre enfant faire la même chose juste après avoir créé la fenêtre.

EDIT

Pour définir le nom de la région d'un contrôle, vous définissez également la propriété ci-joint du RegionManager, comme si ...

RegionManager.SetRegionName(control, "MyRegion"); 

Cependant, vous pouvez le faire dans aswell XAML. La raison pour laquelle vos régions dans une fenêtre séparée ne fonctionnent pas est parce que le RegionManager doit être défini sur la fenêtre de base, comme je l'ai montré ci-dessus.

+0

Ce code ne me semble pas aider tout, mon RegionManager ne semble pas avoir un fucntion appelé SetRegionManager(), ou UpdateRegions(). N'existe-t-il aucun moyen de créer une nouvelle région dans le code? – Shaboboo

+2

Il s'agit d'appels statiques sur la classe RegionManager, pas de méthodes d'instance. Je vais également mettre à jour ma réponse pour montrer comment créer des régions en code. –

+0

Merci d'avoir signalé la méthode statique de RegionManager pour définir le nom de la région. C'était exactement ce que je cherchais! –

0

J'ai trouvé quelque chose qui fonctionne presque. Je suis sûr que si je pouvais lier la vue active de la région à la propriété de contenu contentContol, cela fonctionnerait, mais je ne l'ai pas encore réussi.

IRegionManager MyRegionManager = container.Resolve<IRegionManager>(); 
SingleActiveRegion newRegion = new SingleActiveRegion(); 
MyRegionManager.Regions.Add("WizardSteps", newRegion); 

//Binding 
Binding myBinding = new Binding("ActiveViews"); 
myBinding.Source = newRegion; 
view.stepControl.SetBinding(ContentControl.ContentProperty, myBinding); 
7

C'est en fait assez simple.

Dans votre popup xaml, ajoutez un nom de région comme vous le faites dans le shell. Puis dans le constructeur popups, ajoutez l'appel suivant:

public Popup(IRegionManager regionManager) 
{ 
    InitializeComponent(); 
    RegionManager.SetRegionManager(this,regionManager); 
} 

Cela fonctionne pour moi dans Prism v.1 - ne devrait pas être trop différente dans les versions ultérieures.

Questions connexes