page c# wpf xaml mvvm prism

c# - page - La forma "bonita" de hacer un diálogo modal en WPF con Prism y MVVM Pattern



prism xamarin (4)

ayer utilicé google para encontrar algunas formas de hacer un increíble diálogo modal reutilizable en WPF con PRISM 4.1 y el patrón MVVM. Encontré algunos ejemplos, pero debo decir que ninguno de ellos era tan "bonito" como me gustaba.

Éste: el diálogo modal de WPF (no mvvm -> no use)

Esto es bastante bueno: Mostrar diálogos cuando se usa el patrón MVVM (pero aún así, se está usando un ServiceLocator hecho por mí mismo, que no necesito ya que estoy usando el contenedor IUnity. "forma en mi opinión honesta.

Bueno, después de un tiempo buscando información en la web, algún blog (no puedo encontrar la fuente en este momento) me dijo que PRISM Framework obtuvo algo llamado "solicitudes de interacción". Así que revisé la documentación del prisma y encontré una pequeña parte en el tema "escenarios avanzados de mvvm", pero la información proporcionada en la documentación no es suficiente.

Me gustaría saber si alguien tiene un buen ejemplo o una buena publicación de blog sobre cómo realizar un diálogo modal impresionante en prism wpf con mvvm.

EDIT : Respecto a la pregunta en los comentarios:

¿Qué hace que un diálogo modal sea impresionante?

De hecho una buena pregunta.

  1. Debe ser modal (mientras el cuadro de diálogo está abierto, el resto de la interfaz de usuario debe estar congelado)
  2. La vista de diálogo puede tener su propio modelo de vista o al menos me gustaría dar una instancia de un objeto a la vista de diálogo y devolver un objeto a la vista principal
  3. La vista debe ser un archivo "xaml" propio.
  4. la función de resultados de diálogos de .NET o al menos una forma de obtener una respuesta de lo que el usuario hizo clic en el diálogo

Advertencia: no he usado PRISM y mi respuesta supone el uso de solo WPF y MVVM. No veo esto como un problema importante, ya que su lista de requisitos se puede cumplir sin PRISM (que puede agregarse a la solución básica en una fecha posterior).

Tengo un proyecto en Github que proporciona un FrameworkElement personalizado llamado ModalContentPresenter que permite mostrar contenido modal. El elemento consiste básicamente en dos paneles, uno en capas encima del otro. El panel posterior aloja su contenido principal y el panel frontal aloja su contenido modal. El elemento tiene una propiedad de dependencia que controla si se muestra el contenido modal.

El elemento solo proporciona la funcionalidad básica ''modal'' y es capaz de alojar contenido arbitrario (como la mayoría de los controles WPF). Si, por ejemplo, el contenido modal que está visualizando es para verse y comportarse como una ventana (tener un título, un botón de cierre, arrastrar el mouse, etc.), aún tendrá que trabajar.

Aquí es cómo ModalContentPresenter puede abordar sus requisitos:

Debe ser modal (mientras el cuadro de diálogo está abierto, el resto de la interfaz de usuario debe estar congelado)

El ModalcontentPresenter puede colocarse en cualquier nivel dentro de su jerarquía visual y cualquier elemento detrás del contenido modal (cuando se muestre) será inaccesible . Los controles seguirán habilitados y seguirán reaccionando a cualquier cambio en el viewModel al que estén vinculados, pero el usuario no podrá navegar e interactuar con los controles usando el mouse y el teclado.

La vista de diálogo puede tener su propio modelo de vista o, al menos, me gustaría dar una instancia de un objeto a la vista de diálogo y devolver un objeto a la vista principal.

Esta respuesta de muestra cómo te recomendaría que lo lograras.

La vista debe ser un archivo "xaml" propio.

Tanto el contenido primario como el modal se pueden definir usando archivos xaml en línea o archivos xaml separados (como un UserControl ).

la función de resultados de diálogos de .NET o al menos una forma de obtener una respuesta de lo que el usuario hizo clic en el diálogo

La respuesta enlazada anterior muestra cómo obtener una "respuesta" de su contenido modal. La premisa básica es que sus viewModels se comunican normalmente (ya sea directamente o por otros medios, como un bus de eventos). La única diferencia es que simplemente está mostrando su contenido de una manera que significa que el usuario solo puede interactuar con los datos ''modales''.


Las solicitudes de interacción requieren un poco más de trabajo por adelantado, pero definitivamente son el camino correcto desde la perspectiva purista de MVVM ...

Vi un ejemplo de cómo hacer esto con Prism en la extensión de entrenamiento MVVM In The Box de Karl Shifflett.

Como recuerdo, el ejemplo era bastante tosco, pero debería ponerte en la dirección correcta.

El problema con este tipo de "diálogo" en vista es que no permite que el diálogo salga de los límites de la ventana principal. En el lado positivo, puedes hacer un montón de cosas elegantes de diseño y animación.


PRISM 5.0 encontró una solución rápida para mostrar diálogos modales. Utilizando PopupWindowAction.

<prism:InteractionRequestTrigger SourceObject="{Binding CustomPopupViewRequest, Mode=OneWay}"> <prism:PopupWindowAction> <prism:PopupWindowAction.WindowContent> <views:CustomPopupView /> </prism:PopupWindowAction.WindowContent> </prism:PopupWindowAction> </prism:InteractionRequestTrigger>


revisa mi post desde here

es simple, es mvvm, es un servicio y "todo lo que tienes que hacer" en tu modelo de vista es:

var result = this.uiDialogService.ShowDialog("Dialogwindow title goes here", dialogwindowVM);