Frage

MSDN :

  

Es ist wahrscheinlich, dass die meisten der Ansichten in Ihren Module werden nicht direkt angezeigt werden müssen, sondern erst nach einiger Aktion durch den Benutzer. Je nach Art der Anwendung, können Sie Menüs, Symbolleisten oder andere Navigationsstrategien für die Benutzer Ansichten zuzugreifen. Bei der Initialisierung Methode des Moduls können Sie auch mit der Anwendung der Navigationsstruktur registrieren. In den Event-Handler Ihrer Navigationsstruktur (das heißt, wenn ein Benutzer auf einem Menüpunkt klickt), können Sie Ansicht Injektionstechniken verwenden, um Ansichten zu den entsprechenden Regionen hinzuzufügen.

Ich habe ein ähnliches Szenario, ich bin Ansichten zu Regionen in der Initialisierungsmethode des Moduls mit RegisterViewWithRegion hinzufügen. Ich würde gerne einen Blick basierte Benutzer-Interaktion mit einem Menü angezeigt werden (das ist ein anderes Modul ist).

Wie kann ich dieses Verhalten erreichen, ohne entkoppelt Verhalten Module zu brechen in Prism?

Ist es möglich, eine Ansicht zu aktivieren / anzeigen, die zu einer Region hinzugefügt wurden, etwa durch ModuleA von ModuleB?

War es hilfreich?

Lösung

Was ich tue, ist eine Ansicht Registrierung in meiner Shell mit der folgenden Schnittstelle erstellen (Ich bin hier vereinfacht):

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

Das ist viel zu stark zu vereinfachen, aber hoffentlich das gibt Ihnen ein Bild. Jedes Modul registriert seine Ansichten mit der Shell diese Schnittstelle bei der Initialisierung verwendet. In meiner Schale, erstelle ich ein ViewStor, die diese Dinge speichern.

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 });
     }
}

Dann von meiner IViewRegistry Umsetzung:

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;
     }
}

Jetzt habe ich zwei Dinge:

  1. A ViewStore kann ich ein Menü in meiner Schale erstellen.
  2. Eine Möglichkeit für Module Ansichten von anderen Modulen ohne Kopplung über einfache ModuleDependencies (in Wirklichkeit gehört zu öffnen, auch die ModuleDependency ist nicht notwendig, aber wahrscheinlich richtig.

Offensichtlich ist diese Art und Weise simplifiziert Dinge. Ich habe Dinge, die angeben, ob oder ob nicht eine Ansicht soll ein Menüpunkt sein. Meine App hat mehrere Menüs, etc., aber dies ist die Grundlagen und sollten Sie gehen.

Außerdem sollten Sie Stackoverflow ein wenig eine Chance geben Ihnen eine Antwort zu bekommen ... Sie gaben uns nur 3 Stunden, bevor Sie aufgeben:)

Hope, das hilft.

Andere Tipps

RegisterViewWithRegion nicht über eine Überlastung, die View Namen als Parameter akzeptieren. Dies könnte die Integration von Modulen erleichtert. Ich habe ein Workitem hinzugefügt in Codeplex

Zur Zeit ich hinzufüge Verweis auf andere Module für die View-Injection und lose gekoppelte Natur von Prism

zu verlieren
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top