Prism 4 RegionManager pierde la primera región cuando se agrega la segunda en WPF

Estamos usando Castle Windsor y Prism 4 (febrero de 2010). Estamos usando el programa previo de Windsor que hace que Castle funcione bien con Prism que se lanzó en el paquete CompositeWPFContrib.

Estoy tratando de definir regiones en el XAML de mi Shell principal. Si defino una región, así:

<ContentControl prism:RegionManager.RegionName="{x:Static core:RegionNames.ToolBarRegion}"
                    DockPanel.Dock="Top"/>

Y luego haga lo siguiente en uno de mis módulos, método Initialize:

_regionManager.Regions[RegionNames.ToolBarRegion].Add(typeof(SomeView));

...la vida es buena.

Sin embargo, tan pronto como agregue otra región en el XAML de Shell:

<ContentControl prism:RegionManager.RegionName="{x:Static core:RegionNames.WorkspaceRegion}"
                    DockPanel.Dock="Bottom"/>

Y luego haz:

_regionManager.Regions[RegionNames.WorkspaceRegion].Add(typeof(SomeOtherView));

... Me aparece el error: "El administrador de la región no contiene la región ToolBarRegion".

¿Lo que da? Tan pronto como comento la segunda región, encuentra la primera, cuando agrego la segunda región, estalla, como si el RegionManager se niega a contener una colección de regiones. Debe decirse que esta es mi primera incursión tanto en Castle Windsor como en Prism, por lo que no está fuera de lo posible que me esté perdiendo algo dolorosamente obvio aquí. Cualquier luz que se pudiera arrojar sobre esto sería de gran ayuda.

preguntado el 16 de mayo de 11 a las 18:05

1 Respuestas

¿Está seguro de que es DockPanel al que está agregando sus controles? ¿Quizás su contenedor es un control de contenido en sí mismo (tipo de control que acepta solo un niño)?

Además, puede intentar registrar su administrador de región en el programa de arranque:

RegionManager.SetRegionManager(shell, this.Container.Resolve<IRegionManager>());

Vea las siguientes preguntas:

No se puede encontrar la región en RegionManager (usando PRISM)

WPF, Prism v2, Región en un cuadro de diálogo modal, agregar región en el código detrás

EDITAR

Miré la solución de muestra (enlace en los comentarios) y descubrí que su código de inyección de vista se ejecuta antes de que se cree la vista principal. Los inicializadores de su módulo se llaman en StartRuntime-> CreatePrismBootStrapper, y DisplayRootView (que crea su shell) se llama más tarde. Por supuesto, no puede encontrar la región cuando aún no se ha creado el shell.

Si todo lo que desea registrar sus subcontroles en el código de inicialización del módulo, el descubrimiento de vistas es más adecuado, no requiere que su shell ya esté creado. La inyección de vista es mejor cuando necesita cambiar de vista según la entrada del usuario (en este caso, asegurarse de que el control contenedor se haya registrado depende de usted).

Tienes varias opciones:

  1. Utilice el descubrimiento de vistas, como lo hizo en la solución de muestra.

  2. Cree y registre su instancia de Shell antes de cargar sus módulos. base.DisplayRootView () debería poder encontrarlo en el contenedor para que no cree otro. Una forma de hacerlo, pero no estoy seguro de si es la mejor:

PrismBootstrapper.cs:

protected override DependencyObject CreateShell()
{
    Thor.Application.Views.ShellView view = new Thor.Application.Views.ShellView();
    _container.Register(Castle.MicroKernel.Registration.Component.For<Thor.Application.Views.ShellView>().Instance(view));
    // _container.Resolve<Thor.Application.Views.ShellView>();

    return view;
}

.3. CreatePrismBootstrapper () después de base.DisplayRootView? No funciona (NullPointerException en ServiceLocator y no estoy seguro de si tendría sentido ya que no estoy realmente familiarizado con las bibliotecas que usas, excepto Prism ...

Espero que esto ayude...

contestado el 23 de mayo de 17 a las 13:05

Hay un MainShellView, que es el Shell de la aplicación. Dentro de MainShellView hay MainSiteView, que es un UserControl, que contiene el DockPanel mencionado anteriormente. Ese DockPanel luego contiene los dos ContentControls. En cuanto al RegionManager, está registrado en MainSiteView, no en MainShellView, si eso tiene algo que ver con las cosas. Si está registrado en MainShellView no encuentra ninguna región, registrarlo en MainSiteView exhibe el comportamiento descrito. - Scott

¿Está seguro de que no anida sus regiones? Intente agregar un control simple al DockPanel y vea si permanece allí después de agregar una región. ¿Quizás cuando se agrega la segunda región, se eliminan todos los demás controles de DockPanel, como si DockPanel fuera la región real? - oleaje

Aquí está la jerarquía: nuestra MainWindow es una Actipro RibbonWindow que estamos creando manualmente en el programa de arranque. El contenido de MainWindow se establece en MainShellView, que es un UserControl que tiene dos ContentControls que se superponen, uno para el espacio de trabajo y otro para los diálogos. Workspace ContentControl se establece en MainSiteView al inicio. MainSiteView tiene dos ContentControls, uno es ToolBarRegion y el otro es WorkspaceRegion. Intenté registrar el RM con MainWindow, MainShellView y MainSiteView y siempre tengo este problema. Una región funciona, dos regiones fallan. - Scott

¿Ha intentado insertar 2 regiones en xaml pero comentando esto? _regionManager.Regions[RegionNames.WorkspaceRegion].Add(typeof(SomeOtherView)); ? Cual es el resultado? También verifique su valor constante RegionNames.WorkspaceRegion para el error de copiar / pegar ("ToolBarRegion"?) - oleaje

He comprobado tres veces los errores de copiar / pegar, por lo que pueden descartarse. Cuando comento el código _regionManager y dejo los dos ContentControls en el XAML, cada uno con sus respectivos RegionNames asociados, obtengo un shell con dos controles de contenido vacíos. Entonces eso "funciona", si quieres llamarlo así. Es solo cuando trato de hacer referencia a la primera región que explota. - Scott

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.