c# - tutorial - Superposición de vista de WPF y Prisma
wpf presentacion (2)
Si está utilizando WPF + MVVM con Prism, puede echar un vistazo a este controlador de superposición de vista de mensaje. La mejor parte de este enfoque es que puede escribir pruebas de unidad en el modelo de vista utilizando un controlador de superposición simulada y hacer que el controlador simulado devuelva el resultado que el usuario elegiría en la superposición.
Puede encontrarlo aquí: http://presentationlayer.wordpress.com/2011/05/24/wpf-overlay-message-view-controller/
Espero que esto ayude
Necesito ayuda para superponer vistas utilizando el marco de prisma. Es un poco más compleja que eso, así que déjame explicarte. También podría estar pensando demasiado en esto: D
Tengo shell (ventana wpf) y tengo 2 vistas (A y B, ambos controles de usuario) en un módulo. cuando el caparazón carga la vista A. En la vista A tengo un botón para "abrir" la vista B para alguna entrada del usuario. así que naturalmente pensaría en algún tipo de ventana / control modal, tal vez incluso una ventana emergente. Sin embargo, el problema al que me enfrento con la ventana emergente es que cuando muevo el intérprete de comandos, la ventana emergente permanece fija y no bloquea los eventos en la vista A. Intenté desactivar la vista A para detener el inicio de eventos y también intenté usar un obtener la vista B moverse con el caparazón. Solo el lienzo funciona, pero ahora necesito una forma de bloquearlo. ¿Hay alguna manera de superponer una vista sobre otra vista con prisma? o ¿cómo crean los demás elementos emergentes modales con prism y wpf? cualquier consejo o punteros sería muy apreciado.
Si desea usar cuadros de diálogo integrados sin una ventana adicional, puede usar el RegionManager de Prism para lograr el comportamiento descrito. El truco es poner la región PopUp paralela a su región principal en el árbol visual:
<Grid>
<ContentControl cal:RegionManager.RegionName="MainRegion" IsEnabled={Binding IsNoPopUpActive} />
<ContentControl cal:RegionManager.RegionName="PopUpRegion"/>
</Grid>
Ahora use el RegionManager para poner la vista "A" en la "Región Principal". Cree una clase de controlador similar a IPopUpDialogController. Debería ser responsable de poner su vista "B" (o cualquier otro PopUpView en su aplicación) en la "PopUpRegion" a pedido. Además, debe controlar un indicador que indique que la "región principal" subyacente está habilitada o deshabilitada. De esta forma, un usuario no podrá jugar con los controles en su vista "A" hasta que se cierre la ventana emergente.
Esto incluso se puede hacer de forma modal utilizando ComponentDispatcher.PushModal () antes de insertar un marco en el Dispatcher. Sin embargo, recomendaría evitar diálogos modales.
Actualización : como se solicita en un comentario, el IsNoPopUpActive podría implementarse en el modelo de vista de respaldo. Allí podría vincularlo a la colección de vistas de RegionManager para la región emergente:
public bool IsNoPopUpActive
{
get { return _regionManager.Regions["PopUpRegion"].Views.Count() == 0; }
}
Recuerde activar un evento PropertyChanged tan pronto como modifique la colección de vistas (agregar / eliminar una ventana emergente).
Solo para su información : hoy en día evito desactivar los controles en segundo plano y en su lugar inserto un panel transparente. Esto evita hacer clic en los controles de fondo. Sin embargo, esto no maneja la entrada del teclado (tabulación de los controles). Para corregir la entrada del teclado, debe asegurarse de que el foco del teclado quede atrapado en la ventana emergente ( MSDN en los conceptos de Enfoque de WPF ).
Agregar los siguientes atributos de enfoque a la región emergente debería ser el truco:
KeyboardNavigation.DirectionalNavigation="None"
KeyboardNavigation.ControlTabNavigation="None"
KeyboardNavigation.TabNavigation="Cycle"
KeyboardNavigation.TabIndex="-1"