tutorial samples examples c# prism prism-4

c# - samples - wpf prism tutorial



Prisma 4: RequestNavigate() no funciona (1)

Finalmente descubrí esto. La respuesta está en la Guía del desarrollador de Microsoft Prism (Ver 4), págs. 120-121. Tiene dos partes:

Primero, los objetos UserControl y RibbonTab se estaban resolviendo desde Unity como tipos System.Object . Esa es una limitación de Unity y la sobrecarga que utilicé para registrar los objetos de vista. Para que se resuelvan en los tipos correctos, necesita usar una sobrecarga diferente para IUnityContainer.RegisterType() :

// Register other view objects with DI Container (Unity) m_Container.RegisterType<Object, ModuleAView>("ModuleAView"); m_Container.RegisterType<Object, ModuleARibbonTab>("ModuleARibbonTab");

Esta sobrecarga asigna la resolución nativa de System.Object Unity al tipo correcto para la vista solicitada. Vea la nota en la p. 120 de la Guía del desarrollador .

El segundo problema no se mencionó explícitamente en mi pregunta, pero ocurrió cuando solucioné el primer problema. Quería que se eliminara el RibbonTab cada módulo cuando RibbonTab al otro módulo. Debido a que mi región de la cinta de ItemsControl actúa como un ItemsControl , ambos RibbonTabs terminaron siendo mostrados: el RibbonTab del módulo A no se descargó cuando RibbonTab al módulo B. Para resolver ese problema, implementé IRegionMemberLifetime en las clases de RibbonTab . Ese tema está cubierto en la p. 121 de la Guía del desarrollador .

Por cierto, implementé la interfaz IRegionMemberLifetime en los objetos de vista, en lugar de sus modelos de vista, ya que la interfaz no afecta el extremo posterior de la aplicación, solo el objeto de vista.

Estoy creando una aplicación de demostración para aprender las funciones de navegación de Prism 4. La aplicación tiene dos módulos, cada uno tiene tres Vistas:

  • Un UserControl con un bloque de texto ("Bienvenido al Módulo A")
  • Un RibbonTab (usando un adaptador de región), y
  • Un botón de tarea al estilo de Outlook (como el correo de Outlook, el calendario, etc.)

El Shell tiene tres regiones con nombre: "RibbonRegion", "TaskButtonRegion" y "WorkspaceRegion". Las vistas se cargan en estas regiones. Para probar la configuración básica, registré las tres Vistas con el Prism Region Manager, para que se cargaran al inicio, y todo funcionó como se esperaba.

A continuación, modifiqué la configuración para que solo los botones de tareas se cargaran en el inicio. Otras vistas se cargarían solo a pedido, haciendo clic en un botón de tarea. Mis inicializadores de módulo se ven así:

public void Initialize() { /* We register the Task Button with the Prism Task Button Region because we want it * to be displayed immediately when the module is loaded, and for the lifetime of * the application. */ // Register Task Button with Prism Region m_RegionManager.RegisterViewWithRegion("TaskButtonRegion", typeof(ModuleATaskButton)); /* We register these objects with the Unity container because we don''t want them * instantiated until we navigate to this module. */ // Register View and Ribbon Tab as singletons with Unity container m_Container.RegisterType(typeof(ModuleAView), "ModuleAView", new ContainerControlledLifetimeManager()); m_Container.RegisterType(typeof(ModuleARibbonTab), "ModuleARibbonTab", new ContainerControlledLifetimeManager()); }

Cuando el usuario hace clic en un botón de tarea, invoca un objeto ICommand que llama a IRegionManager.RequestNavigate() para mostrar las vistas:

public void Execute(object parameter) { // Initialize var regionManager = m_ViewModel.RegionManager; // Show Ribbon Tab var moduleARibbonTab = new Uri("ModuleARibbonTab", UriKind.Relative); regionManager.RequestNavigate("RibbonRegion", moduleARibbonTab); // Show View var moduleAView = new Uri("ModuleAView", UriKind.Relative); regionManager.RequestNavigate("WorkspaceRegion", moduleAView); }

El comando se invoca cuando se hace clic en un botón de tarea, pero lo que obtengo es esto:

El UserControl aparentemente se está cargando como un objeto System.Object , y sospecho que el RibbonTab está cargando el mismo. Creo que el problema es con mi llamada a RequestNavigate() o mi registro en Unity. Pero no puedo identificar el problema.

¿Alguien puede arrojar alguna luz sobre lo que está pasando? Gracias por tu ayuda.