Я отвечаю на свой вопрос, чтобы помочь другим найти все ответы, которые я изо всех сил пытался найти в одном месте. То, что выше, кажется прямой проблемой, на самом деле представляет множество проблем, на которые я надеюсь ответить достаточно ниже.
Здесь идет.
Ваше окно WPF, которое будет служить общим диалогом, может выглядеть примерно так:
<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>
После MVVM правильный способ показать диалог - через посредника. Чтобы использовать посредник, вам, как правило, также требуется какой-то сервисный локатор. Подробности о посреднике смотрите здесь .
Решение, на котором я остановился, заключалось в реализации интерфейса IDialogService, который решается с помощью простого статического ServiceLocator. Эта превосходная статья о проекте кода содержит подробности об этом. Обратите внимание на это сообщение на форуме статьи. Это решение также решает проблему обнаружения окна владельца через экземпляр ViewModel.
Используя этот интерфейс, вы можете вызвать IDialogService.ShowDialog (ownerViewModel, dialogViewModel). На данный момент я звоню от владельца ViewModel, что означает жесткие ссылки между моими ViewModel. Если вы используете агрегированные события, вы, вероятно, будете вызывать это из проводника.
Установка минимального размера в представлении, которое в конечном итоге будет отображаться в диалоговом окне, не устанавливает автоматически минимальный размер диалогового окна. Кроме того, поскольку логическое дерево в диалоговом окне содержит ViewModel, вы не можете просто привязать свойства элемента WindowContent. На этот вопрос есть ответ с моим решением.
Ответ, о котором я упоминал выше, также включает код, который центрирует окно на владельце.
Наконец, отключение кнопок минимизации и максимизации - это то, что WPF не может сделать изначально. Самое элегантное решение ИМХО использует это .