2009-08-29 7 views
1

Je me lève sur Composite WPF, la construction d'une petite application de démonstration pour résoudre les problèmes. Mon application a une région et deux modules, Module A et Module B. Chaque module contient un simple bloc de texte "Hello World". Les deux modules sont configurés en charge à la demande, selon this MSDN How-To.Composite WPF: Affichage/masquage des vues?

La coque possède deux boutons, "Load Module A" et "Load Module B". Quand un bouton est cliqué, le module correspondant est chargé. Alors, disons que je clique sur "Load Module A", puis sur "Load Module B". Module A, puis le module B est chargé comme prévu. Mais si je clique à nouveau sur "Charger le module A", rien ne se passe.

Je suis bloqué à ce stade. Je pense que mon problème est que j'ai besoin d'activer et de désactiver les vues dans les modules, plutôt que d'utiliser le chargement à la demande. Mais je n'ai aucune idée de comment faire cela, et je ne trouve pas de documentation ou de blogs qui en parlent. Alors, voici ma question: Comment charger/décharger (ou afficher/masquer) les vues? Si quelqu'un peut me diriger vers un exemple de code, je l'apprécierais vraiment. Merci de votre aide.

Répondre

5

J'ai trouvé ma réponse. Voici l'approche: Chargez tous les modules au démarrage, puis activez et désactivez les vues selon vos besoins. Je vais écrire ce problème comme un article CodeProject, mais voici un aperçu de la façon de le faire:

(1) Dans la méthode Initialize() du module, ajoutez le module, mais ne l'activez pas:

public void Initialize() 
{ 
    // Get main region 
    var mainRegion = m_RegionManager.Regions["MainRegion"]; 

    // Load Module B 
    var newView = new ModuleBView(); 
    mainRegion.Add(newView, "ModuleA.ModuleAView"); 
} 

Notez que la méthode Add() a deux paramètres. Le deuxième paramètre est le nom de la vue, que nous définissons à la valeur produite par la méthode ToString() de la vue. Nous verrons pourquoi à l'étape suivante.

(2) Lors de l'activation d'une vue, nous devons désactiver la vue précédente. Mais nous ne savons pas le nom de la vue, donc nous désactiver toutes les vues actives:

public static void ClearRegion(IRegion region) 
{ 
    // Get existing view names 
    var oldViewNames = new List<string>(); 
    foreach (var v in region.Views) 
    { 
     var s = v.ToString(); 
     oldViewNames.Add(s); 
    } 

    // Remove existing views 
    foreach (var oldViewName in oldViewNames) 
    { 
     var oldView = region.GetView(oldViewName); 
     region.Deactivate(oldView); 
    } 
} 

depuis que nous avons le nom de chaque vue égale à sa valeur ToString(), nous pouvons obtenir les noms facilement sans savoir quoi que ce soit à propos d'eux.

(3) Maintenant, nous activons la nouvelle vue. Je le fais dans une méthode MVVM ICommand.Execute():

public void Execute(object parameter) 
{ 
    // Get main region 
    var mainRegion = m_ViewModel.RegionManager.Regions["MainRegion"]; 

    // Clear region 
    ModuleServices.ClearRegion(mainRegion); 

    // Activate Module A view 
    var moduleAView = mainRegion.GetView("ModuleA.ModuleAView"); 
    mainRegion.Activate(moduleAView); 
} 

Il faut espérer que ce sera suffisant pour vous aller. Comme je l'ai dit, je prévois de faire une rédaction plus complète, avec un code de démo, pour CodeProject.

David Veeneman
Systèmes de prévision

Questions connexes