Question

De MSDN :

  

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 de l'application, vous pouvez utiliser les menus, barres d'outils ou d'autres stratégies de navigation pour vos utilisateurs d'accéder à des 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 (qui est, lorsqu'un utilisateur clique sur un élément de menu), vous pouvez utiliser View techniques d'injection pour ajouter des vues sur les régions appropriées.

J'ai un scénario similaire, j'ajoute Vues aux régions dans la méthode d'initialisation du module à l'aide RegisterViewWithRegion. J'aimerais afficher une vue interaction utilisateur basée sur un menu (qui est un autre module).

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

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

Était-ce utile?

La solution

Ce que je fais est de créer un registre de vue dans mon Shell avec l'interface suivante (je simplifie):

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

Ceci est ainsi simplifier à l'extrême, mais nous espérons que cela vous donne une image. Chaque module enregistre ses vues avec le shell en utilisant cette interface lors de l'initialisation. Dans ma coquille, je crée une 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 });
     }
}

Alors 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. Un 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 correct.

Il est évident que cette façon les choses une simplification à outrance. J'ai des choses qui indiquent si oui ou non une vue doit être un élément de menu. Mon application a plusieurs menus, etc, mais ce sont les bases et devrait vous permettre de continuer.

En outre, vous devez donner Stackoverflow un peu de chance de vous obtenir une réponse ... vous ne nous avez 3 heures avant abandonné:)

Hope this helps.

Autres conseils

RegisterViewWithRegion n'a pas une surcharge qui accepte Voir le nom en tant que paramètre. Cela aurait pu atténuer 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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top