Pregunta

MSDN :

  

Es probable que la mayoría de las vistas en sus módulos no tendrá que ser visualizado directamente, pero sólo después de algún tipo de acción por parte del usuario. Dependiendo del estilo de la aplicación, es posible que desee utilizar los menús, barras de herramientas, u otras estrategias de navegación para los usuarios acceder a la vista. En el método de inicialización del módulo, también puede registrarse con estructura de navegación de la aplicación. En los controladores de eventos de su estructura de navegación (es decir, cuando un usuario hace clic en un elemento de menú), es posible utilizar la vista de las técnicas de inyección para añadir vistas a las regiones apropiadas.

Tengo un escenario similar, estoy añadiendo Vistas a las Regiones en el método de inicialización del módulo usando RegisterViewWithRegion. Me encantaría mostrar una interacción del usuario con base Vista con un menú (que es un módulo diferente).

¿Cómo puedo lograr este comportamiento sin romper el comportamiento desacoplado de módulos en Prisma?

¿Es posible activar / muestran una vista en la que se ha agregado a una región, por decirlo de ModuleA ModuleB?

¿Fue útil?

Solución

Lo que hago es crear un registro vista en mi Shell con la interfaz siguiente (estoy simplificando aquí):

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

Esta es la manera simplificar demasiado, pero espero que esto le da una imagen. Cada módulo registra sus puntos de vista con la cáscara utilizando esta interfaz en la inicialización. En mi concha, creo un ViewStore que almacena estas cosas.

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

Luego de mi aplicación 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;
     }
}

Ahora tengo dos cosas:

  1. Una ViewStore que puede utilizar para crear un menú en mi concha.
  2. Una forma de módulos para abrir puntos de vista de propiedad de otros módulos sin acoplamiento allá ModuleDependencies simples (en realidad, incluso el ModuleDependency no es necesario, pero probablemente correcta.

Es evidente que de esta manera simplifica las cosas. Tengo cosas que indican si un punto de vista debe ser un elemento de menú. Mi aplicación tiene varios menús, etc, pero esto es lo básico y debe conseguir que va.

Además, debe dar Stackoverflow un poco de la oportunidad de obtener una respuesta ... que sólo nos dio 3 horas antes de que renunció a:)

Espero que esto ayude.

Otros consejos

RegisterViewWithRegion no tiene una sobrecarga que aceptar la opinión nombre como parámetro. Esto podría haber facilitado la integración de los módulos. He añadido un elemento de trabajo en CodePlex

Actualmente estoy añadiendo la referencia a otros módulos para Ver inyección y la pérdida de la naturaleza imprecisa de Prisma

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top