Je réponds à ma propre question pour aider les autres à trouver toutes les réponses que j'ai eu du mal à trouver en un seul endroit. Ce qui précède semble être un problème simple, présente en réalité de multiples problèmes que j'espère répondre suffisamment ci-dessous.
Voilà.
Votre fenêtre WPF qui servira de la boîte de dialogue générique peut ressembler à ceci:
<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>
Après MVVM, la bonne façon de montrer une boîte de dialogue se fait par un médiateur. Pour utiliser un médiateur, vous avez généralement besoin d'un localisateur de service. Pour les détails spécifiques au médiateur, regardez here.
La solution sur laquelle j'ai choisi impliquait l'implémentation d'une interface IDialogService qui est résolue via un simple ServiceLocator statique. This excellent article codeproject a les détails à ce sujet. Prenez note du message this dans le forum de l'article. Cette solution résout également le problème de la découverte de la fenêtre propriétaire via l'instance ViewModel.
En utilisant cette interface, vous pouvez appeler IDialogService.ShowDialog (ownerViewModel, dialogViewModel). Pour l'instant, je l'appelle du propriétaire ViewModel, ce qui signifie que j'ai des références difficiles entre mes ViewModels.Si vous utilisez des événements agrégés, vous appellerez probablement cela d'un conducteur.
La définition de la taille minimale sur la vue qui sera éventuellement affichée dans la boîte de dialogue ne définit pas automatiquement la taille minimale de la boîte de dialogue. En outre, puisque l'arbre logique dans la boîte de dialogue contient le ViewModel, vous ne pouvez pas simplement lier aux propriétés de l'élément WindowContent. This question a une réponse avec ma solution.
La réponse que je mentionne ci-dessus comprend également le code qui centre la fenêtre sur le propriétaire. Enfin, la désactivation des boutons de réduction et de maximisation est quelque chose que WPF ne peut pas faire en mode natif. La solution la plus élégante IMHO utilise this.
Merci de montrer votre approche! –
Pourquoi le downvote anonyme? –