Sto rispondendo alla mia domanda per aiutare gli altri a trovare tutte le risposte che ho faticato a trovare in un posto. Quanto sopra sembra un problema semplice, in realtà presenta più problemi che spero di rispondere sufficientemente sotto.
Ecco qui.
La finestra WPF che servirà come la finestra di dialogo generica può essere simile a questa:
<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>
seguito MVVM, il modo giusto per mostrare una finestra di dialogo è attraverso un mediatore. Per utilizzare un mediatore, in genere è necessario anche un localizzatore di servizi. Per dettagli specifici del mediatore, vedi here.
La soluzione che ho scelto implicava l'implementazione di un'interfaccia IDialogService risolta tramite un semplice ServiceLocator statico. This articolo codeproject eccellente ha i dettagli su questo. Prendere nota del messaggio this nel forum degli articoli. Questa soluzione risolve anche il problema di scoprire la finestra del proprietario tramite l'istanza ViewModel.
Utilizzando questa interfaccia, è possibile chiamare IDialogService.ShowDialog (ownerViewModel, dialogViewModel). Per ora, sto chiamando questo dal proprietario ViewModel, il che significa che ho riferimenti duri tra i miei ViewModels.Se usi eventi aggregati, probabilmente lo chiamerai da un conduttore.
L'impostazione della dimensione minima nella vista che verrà visualizzata nella finestra di dialogo non imposta automaticamente la dimensione minima della finestra di dialogo. Inoltre, poiché l'albero logico nella finestra di dialogo contiene ViewModel, non è possibile associare solo le proprietà dell'elemento WindowContent. La domanda This ha una risposta con la mia soluzione.
La risposta che ho menzionato sopra include anche il codice che centra la finestra sul proprietario.
Infine, la disattivazione dei pulsanti di riduzione e ingrandimento è qualcosa che WPF non può fare in modo nativo. La soluzione più elegante IMHO utilizza this.
Grazie per aver mostrato il tuo approccio! –
Perché il downvote anonimo? –