2010-05-27 15 views
5

Tengo una pequeña herramienta similar al Panel de control de Windows. La herramienta nos permite administrar usuarios, configurar bases de datos, administrar scripts, etc. La página de inicio presenta todas las subcategorías de la aplicación. Al hacer clic en un enlace, carga la vista de esta categoría en el panel derecho y un pequeño panel izquierdo muestra las tareas disponibles para esta categoría. Sencillo.Prisma: cambie la vista activa

Básicamente, lo que quiero hacer es tener una barra de estado "contextualizada". Si se encuentra en una vista donde debe estar conectado, la barra de estado debería mostrar su estado. Si está en una vista donde se deben mostrar las informaciones, lo quiero en mi barra de estado.

ya puse una Region (llamado StatusBarRegion de la barra de estado en mi concha. Para cada módulo, que registró el StatusBarView de este módulo en la región de la cáscara.

Ahora, quiero manejar la cambio de contexto. necesito activar la buena vista cuando es el momento.

Pero cada vez que intento resolver el StatusBarRegion, no se puede encontrar en las regiones del controlador región.

Sede,

var region = _regionManager.Regions[.RegionNames.StatusBarRegion]; 
region.Activate(_container.Resolve<StatusBarView>()); 

La región es siempre nula. Porque eso ?

Gracias por su tiempo.

Respuesta

0

¿Por qué la región era nula? El fragmento de código estaba en el Método de inicialización del Módulo, por lo que aún no se creó la interfaz de usuario.

Para la mejor manera de administrar mis barras de estado, todavía me pregunto cómo voy a hacerlo.

+0

De acuerdo con el equipo de PRISM, la inicialización del módulo ocurrirá después de que el shell se haya inicializado. Consulte aquí: http://msdn.microsoft.com/en-us/library/gg430868(v=pandp.40).aspx, por lo que su suposición de que no se creó la IU, creo que es incorrecta. –

1

Verifique de nuevo RegionNames.StatusBarRegion valor si ya es igual con el objetivo de la región en su caparazón.

Si lo hace, la región no debería ser nula, creo, a menos que coloque su manejador en su view/viewmodel del módulo y no haya tenido el administrador de región y contenedor en el constructor.

Digamos que se manejó en su vista SilverlightUserControl1. El constructor podría ser así:

private readonly IRegionManager _regionManager; 
private readonly IUnityContainer _container; 

public SilverlightUserControl1(IRegionManager regionManager, IUnityContainer container) 
{ 
    _regionManager = regionManager; 
    _container = container; 
} 

private Button1_Click(object sender, RoutedEventArgs e) 
{ 
    var statusBarView = _container.Resolve<StatusBarView>(); 
    statusBarRegion = _regionManager.Regions["StatusBarRegion"]; 

    statusBarRegion.Add(statusBarView, "StatusBarView"); 
    statusBarRegion.Activate(statusBarView); 

    // or you could remove all views in `ActiveViews` and add the view then 
    // (no need to activate) 
} 
+0

Gracias por su tiempo, ha sido apreciado. Pero como dije anteriormente, la región es nula porque el código estaba en el método Inicializar del Módulo, por lo que la IU aún no se había creado, por lo que no se pudo resolver la región. Dicho esto, su respuesta proporciona un buen ejemplo de la forma correcta de usar las regiones. Gracias de nuevo. – esylvestre

+0

¿Hay alguna ventaja en la desactivación y activación de vistas sobre el uso de 'RemoveAll()' seguido de agregar la vista deseada? Gracias. –

3

Creo que su error está relacionado con

region.Activate(_container.Resolve<StatusBarView>()); 

y no

var region = _regionManager.Regions[.RegionNames.StatusBarRegion]; 

Hay algunas razones de por qué esto podría ser su problema y te daré soluciones que podrías probar.

En primer lugar, region.Activate() requiere que la instancia de vista ya exista en esa región. Por lo tanto, desde su código, sospecho que _container.Resolve<StatusBarView>() le está dando una nueva instancia del StatusBarView y, por lo tanto, no habrá existido en esa región.

Solución: Cuando registre el StatusBarView con el contenedor, considere una vista singleton.

_container.RegisterType<IStatusBarView,StatusBarView> 
    (new ContainerControlledLifetimeManager()) 

En segundo lugar, debe registrar el tipo de vista (o añadir manualmente) para la región antes de poder activarla.

Solución:

_regionManager.RegisterViewWithRegion 
    (RegionNames.StatusBarRegion, typeof(IStatusBarView)); 

alternativa:

_regionManager.Regions[RegionNames.StatusBarRegion] 
    .Add(_container.Resolve<StatusBarView>()); 
1

He tenido un problema similar hace un tiempo. He publicado una pregunta here, pero luego descubrí el problema y su solución.

Mi problema era que mi región no estaba definida en el Shell. Consulte el full question and answer here.

Espero que esto ayude.

Cuestiones relacionadas