2009-11-04 8 views
0

De MSDN:intégration de modules avec application dans Prism aka CompositeWpf

Il est probable que la plupart des vues dans vos modules ne doivent être affichés directement, mais seulement après une action de l'utilisateur. Selon le style d'application, vous pouvez utiliser des menus, des barres d'outils ou d'autres stratégies de navigation pour que vos utilisateurs puissent accéder aux vues. Dans la méthode d'initialisation du module, vous pouvez également vous inscrire à la structure de navigation de l'application. Dans les gestionnaires d'événements de votre structure de navigation (c'est-à-dire, lorsqu'un utilisateur clique sur un élément de menu), vous pouvez utiliser les techniques d'injection de vue pour ajouter des vues aux régions appropriées.

J'ai un scénario similaire, j'ajoute des vues aux régions dans la méthode d'initialisation de Module en utilisant RegisterViewWithRegion. J'adorerais afficher une interaction utilisateur basée sur View avec un menu (qui est un module différent).

Comment puis-je obtenir ce comportement sans rompre le comportement découplé des modules dans Prism?

Est-il possible d'activer/afficher une vue qui a été ajoutée à une région, disons par ModuleA de ModuleB?

Répondre

2

Ce que je fais est de créer un registre de vue dans mon Shell avec les éléments suivants interface (je simplifie ici):

public interface IViewRegistry 
{ 
    void RegisterView(string title, string key, Func<UIElement> viewCreationMethod); 
    void OpenView(string key); 
} 

Ceci est trop simpliste, mais j'espère que cela vous donne une image. Chaque module enregistre ses vues avec le shell en utilisant cette interface lors de l'initialisation. Dans mon shell, je crée un ViewStore qui stocke ces choses.

public static class ViewStore 
{ 
    public Dictionary<string, ViewEntry> Views { get; set; } 
    static ViewStore() 
    { 
      Views = new Dictionary<string, ViewEntry>(); 
    } 

    public void RegisterView(string name, string key, Func<UIElement> createMethod) 
    { 
     Views.Add(key, new ViewEntry() { Name = name, CreateMethod = createMethod }); 
    } 
} 

ensuite de ma mise en œuvre de IViewRegistry:

public class ViewRegistryService : IViewRegistry 
{ 
    public void RegisterView(string title, string key, Func<UIElement> createMethod) 
    { 
      ViewStore.RegisterView(title, key, createMethod); 
    } 

    public void OpenView(string key) 
    { 
      //Check here with your region manager to see if 
      //the view is already open, if not, inject it 
      var view = _regionManager.Regions["MyRegion"].GetView(key); 
      if(view != null) 
      { 
       view = ViewStore.Views[key](); 
       _regionManager.Regions["MyRegion"].Add(view, key); 
      } 
      _regionManager.Regions["MyRegion"].Activate(view); 
    } 

    private IRegionManager _regionManager; 
    public ViewRegistryService(IRegionManager rm) 
    { 
      _regionManager = rm; 
    } 
} 

Maintenant, j'ai deux choses:

  1. A ViewStore je peux utiliser pour créer un menu dans ma coquille.
  2. Une façon pour les modules d'ouvrir des vues appartenant à d'autres modules sans couplage au-delà ModuleDependencies simples (en réalité, même le ModuleDependency n'est pas nécessaire, mais probablement correcte.

Il est évident que cette façon simplifie les choses. J'ai des choses que indiquer si une vue doit ou non être un élément de menu.Mon application a plusieurs menus, etc, mais ce sont les bases et devraient vous mettre en route

Aussi, vous devriez donner à Stackoverflow un peu de chance de vous obtenir une réponse ... vous nous avez seulement donné 3 heures avant que vous n'abandonniez :)

J'espère que cela aide.

+0

Merci pour les entrées. Pourriez-vous s'il vous plaît jeter un oeil à http://stackoverflow.com/questions/1678423/what-is-the-best-method-to-load-views-dynamically-from-a-navigation-control-in-pr je l'ai fait ce poste avant de voir votre réponse ici. – Raj

+0

Salut pourriez-vous me donner un échantillon de RegisterView(), en particulier la partie Func . – Raj

+0

Voici un exemple: http://dl.dropbox.com/u/376992/CAGMenus.zip –

0

RegisterViewWithRegion n'a pas de surcharge qui accepte le nom de vue en tant que paramètre. Cela aurait facilité l'intégration des modules. J'ai ajouté un élément de travail dans Codeplex

Actuellement, je suis d'ajouter une référence à d'autres modules pour View Injection et de perdre la nature à couplage lâche de prisme

+0

Ceci n'est pas nécessaire. Je posterai une alternative sous peu. –