【发布时间】:2020-08-12 03:45:05
【问题描述】:
我是 PRISM 库的新手。尽管它更新得很快,但文档令人困惑、不完整,并且混合了许多版本。目前,我使用的是PRISM 8。
我想要一些关于如何从主窗口按钮打开多个窗口(模态和非模态)、发送参数和接收消息的示例,因为我只能找到注入到窗口视图。
【问题讨论】:
我是 PRISM 库的新手。尽管它更新得很快,但文档令人困惑、不完整,并且混合了许多版本。目前,我使用的是PRISM 8。
我想要一些关于如何从主窗口按钮打开多个窗口(模态和非模态)、发送参数和接收消息的示例,因为我只能找到注入到窗口视图。
【问题讨论】:
Prism 库不会以任何方式限制您使用没有它的 WPF 中的窗口。您可以编写自己的窗口服务来满足您的管理实例化和显示窗口的要求。如何实现它们之间的通信取决于您。您可以使用 Prism 的事件聚合器在视图模型之间进行通信。
IDialogService 是 Prism 7.2.0.1367 中引入的一项功能,它是此类服务的内置实现。 documentation 是最新的,没有什么要添加的,因为它涵盖了从创建对话框、传递参数、显示对话框以及注册自定义窗口和样式的所有内容。
Prism 8 中唯一的变化是您现在可以注册多个对话框窗口。
// Default dialog window
containerRegistry.RegisterDialogWindow<MyDialogWindow>();
// Another dialog window that can be accessed by name
containerRegistry.RegisterDialogWindow<MyOtherDialogWindow>(nameof(MyOtherDialogWindow));
当使用对话服务显示对话时,您可以按名称引用它们。
// Shows the dialog view in them default dialog window
dialogService.Show(nameof(MyView), new DialogParameters(), result => { /* ...handle result.*/ });
// Shows the dialog view in the "MyOtherDialogWindow"
dialogService.Show(nameof(MyView), new DialogParameters(), result => { /* ...handle result.*/ }, nameof(MyOtherDialogWindow));
我想要一些关于如何从主窗口按钮打开多个窗口(模式和非模式)的示例的帮助,[...]
您需要在视图模型中访问IDialogService。将其传递给构造函数并将其存储在字段中。依赖容器会自动注入。
private readonly IDialogService _dialogService;
public MyViewModel(IDialogService dialogService)
{
_dialogService = dialogService;
}
在视图模型中创建一个ICommand 属性,视图中的按钮将绑定到该属性。
OpenDialogCommand = new DelegateCommand(ExceuteOpenDialog);
在execute方法中,创建对话框参数并使用Show或ShowDialog(模态)显示对话框。
private void ExceuteOpenDialog()
{
dialogService.Show(nameof(MyOtherView), new DialogParameters(), result => { /* ...handle result.*/ });
}
[...] 发送参数和接收消息,[...]
这取决于您的要求,但您可以查看事件聚合器。 documentation 仍然有效且全面,因此无需添加任何内容。
[...] 我只能找到注入到窗口视图中的 UserControl 视图的示例。
这就是对话服务的工作方式。您可以使用任何UserControl 在对话框中显示。对话服务自动将其放置在对话宿主窗口中。通过这种方式,您可以重用您的视图并使其更易于更改和维护。如果您将视图定义为 Window,您将失去在不更改视图类型及其 XAML 的情况下应用不同对话框窗口的灵活性,以及在其他视图中的任何其他位置作为组件使用它的能力。
【讨论】: