我将回答自己的问题,以帮助其他人在一个地方找到我苦苦寻找的所有答案。看起来很简单的问题实际上涉及到多个问题,我希望以下内容能够足够解决。
以下是详细内容。
作为通用对话框的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进行解析。
这篇优秀的codeproject文章详细介绍了这一点。请注意文章论坛中
此消息。此解决方案还解决了通过ViewModel实例发现所有者窗口的问题。
使用此接口,您可以调用IDialogService.ShowDialog(ownerViewModel,dialogViewModel)。目前,我从所有者ViewModel中调用它,这意味着我的ViewModel之间存在硬引用。如果您使用聚合事件,则可能会从指挥员中调用此操作。
在最终显示在对话框中的视图上设置最小大小并不会自动设置对话框的最小大小。此外,由于对话框中的逻辑树包含ViewModel,因此无法仅绑定到WindowContent元素的属性。
这个问题有一个包含我的解决方案的答案。
我上面提到的答案还包括将窗口居中于所有者的代码。
最后,禁用最小化和最大化按钮是WPF无法本地执行的操作。在我看来,最优雅的解决方案是使用
这个。