Estoy respondiendo mi propia pregunta para ayudar a otros a encontrar todas las respuestas que me costó encontrar en un solo lugar. Lo que arriba parece un problema directo, en realidad presenta múltiples problemas que espero responder lo suficientemente a continuación.
Aquí va.
Su ventana de WPF que servirá como el cuadro de diálogo genérico puede ser algo como esto:
<Window x:Class="Example.ModalDialogView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:ex="clr-namespace:Example"
Title="{Binding Path=mDialogWindowTitle}"
ShowInTaskbar="False"
WindowStartupLocation="CenterOwner"
WindowStyle="SingleBorderWindow"
SizeToContent="WidthAndHeight"
ex:WindowCustomizer.CanMaximize="False"
ex:WindowCustomizer.CanMinimize="False"
>
<DockPanel Margin="3">
<StackPanel DockPanel.Dock="Bottom" Orientation="Horizontal" FlowDirection="RightToLeft">
<Button Content="Cancel" IsCancel="True" Margin="3"/>
<Button Content="OK" IsDefault="True" Margin="3" Click="Button_Click" />
</StackPanel>
<ContentPresenter Name="WindowContent" Content="{Binding}"/>
</DockPanel>
</Window>
Siguiendo MVVM, de la manera correcta para mostrar un cuadro de diálogo es a través de un mediador. Para usar un mediador, normalmente también necesita un localizador de servicios. Para detalles específicos del mediador, mira here.
La solución que establecí implicó la implementación de una interfaz IDialogService que se resuelve a través de un simple ServiceLocator estático. This excelente artículo del proyecto de código tiene los detalles sobre eso. Tome nota del mensaje this en el foro del artículo. Esta solución también resuelve el problema de descubrir la ventana del propietario a través de la instancia de ViewModel.
Usando esta interfaz, puede llamar a IDialogService.ShowDialog (ownerViewModel, dialogViewModel). Por ahora, estoy llamando esto desde el propietario ViewModel, lo que significa que tengo referencias difíciles entre mis ViewModels.Si usa eventos agregados, probablemente lo llamará un conductor.
Al establecer el tamaño mínimo en la Vista que se mostrará finalmente en el cuadro de diálogo, no se establece automáticamente el tamaño mínimo del cuadro de diálogo. Además, dado que el árbol lógico en el cuadro de diálogo contiene ViewModel, no puede vincularse solo a las propiedades del elemento WindowContent. This pregunta tiene una respuesta con mi solución.
La respuesta que menciono arriba también incluye un código que centra la ventana en el propietario.
Por último, deshabilitar los botones minimizar y maximizar es algo que WPF no puede hacer de forma nativa. La solución más elegante en mi humilde opinión es usar this.
Gracias por mostrar su enfoque! –
¿Por qué el voto anónimo? –