2009-09-23 4 views
1

J'ai créé un projet en utilisant le framework PRISM. J'ai quelques modules que je peux enregistrer et afficher dans la coque et cela fonctionne bien. Ce que je dois faire est d'afficher et de masquer dynamiquement les modules lorsqu'un événement particulier est reçu de l'agrégateur d'événements.Silverlight PRISM, afficher/masquer des modules question

Je déclenche un événement DisplayModule qui devrait être reçu et cacher un module existant et en montrer un nouveau, mais ma question est où est l'endroit où je devrais recevoir cet événement et afficher le module? La coquille? Si oui, comment ferais-je cela car le shell est le niveau supérieur et ne semble pas hériter des méthodes Unity requises.

Je pensais aussi que je pourrais avoir un module séparé qui écoutait pour l'événement DisplayModule et utilisé le gestionnaire de région pour cacher le module précédent et montrer le nouveau. Cela aurait besoin de référencer tous les autres modules pour pouvoir résoudre leur type, est-ce une mauvaise pratique?

Espérons que cela a du sens.

Merci pour votre temps

Répondre

4

Vous ne pouvez pas décharger un module entier, cependant. Vous pouvez dynamiquement charger un, mais ne pas en décharger un. Pour plus d'informations lire chargement des modules à la demande dans l'article suivant: http://msdn.microsoft.com/en-us/library/dd458911.aspx

Assomption: Je vais commencer avec l'hypothèse que lorsque vous dites que vous voulez décharger un module, vous voulez vraiment que tous les de ses vues à supprimer de votre application.

Tout d'abord, parlons du fonctionnement de vos modules et de la façon dont ils affichent leur contenu sur votre shell.

Votre shell contiendra une ou plusieurs régions auxquelles vos modules peuvent ensuite enregistrer des vues à l'initialisation.

public MyFirstModule : IModule 
{ 
    IRegionManager _mgr; 
    public MyFirstModule(IRegionManager mgr) 
    { 
      _mgr = mgr; 
    } 

    public void Initialize() 
    { 
      _mgr.RegisterViewWithRegion("MainRegion", typeof(MyView)); 
    } 

} 

Qu'est-ce que vous pouvez faire, cependant, est de changer votre initialisation du module pour suivre les vues qui ont été enregistrées avec ce module et les décharger, le cas échéant.

public MyFirstModule : IModule 
{ 
    IRegionManager _mgr; 
    IEventAggregator _agg; 
    IUnityContainer _container; 
    public MyFirstModule(IRegionManager mgr, 
          IEventAggregator agg, 
          IUnityContainer container) 
    { 
      _mgr = mgr; 
      _agg = agg; 
      _container = container; 
    } 

    List<object> Views = new List<object>(); 
    public void Initialize() 
    { 
      _mgr.RegisterViewWithRegion("MainRegion",() = 
      { 
       MyView view = _container.Resolve<MyView>(); 

       //Track this view so I can remove it if needed 
       Views.Add(view); 
       return view; 
      }); 

      _agg.GetEvent<UnloadModuleRequest>.Subscribe(RemoveViews,     
                 ThreadOptions.UIThread); 
    } 

    private void RemoveViews(string moduleToUnload) 
    { 
      //If this is true, that means the Shell is asking 
      //me to unload, so I will remove any views I've 
      //registered from any regions they were registered to 
      if(moduleToUnload == "MyFirstModule") 
      { 
       foreach(object view in Views) 
       { 
        _mgr.Regions["MainRegion"].Remove(view); 
       } 
      } 

    } 

} 

De cette façon, votre Shell peut publier un événement appelé UnloadModuleRequest (de type CompositePresentationEvent<string>) et ont un module d'écoute déchargent toutes les vues qu'il a enregistré. J'espère que cela est proche de ce que vous voulez.

2

Les fils suivants face à des situations similaires et expliquer les moyens possibles d'atteindre vos objectifs:

Faites-moi savoir si cela peut vous aider.

Damian Schenkelman http://blogs.southworks.net/dschenkelman

+0

Cela ne mentionne pas vraiment quoi que ce soit au sujet de décharger un module. –

+0

Ce premier fil est plutôt bon, cependant. Quelques-unes des mêmes choses mentionnées ici apparaîtront probablement lors du "rechargement" du module. Peut-être que cette discussion parlera de poursuivre ce qu'il/elle essaie de faire ... il semblerait que l'OP ait une légère incompréhension de ce qu'est un module et que ce dernier l'évite beaucoup. Merci de l'avoir posté. –