使用Prism和MVVM Pattern在WPF中进行模态对话的“漂亮”方法

昨天我用谷歌找到了几种方法,用PRISM 4.1和MVVM模式在WPF中制作了一个非常棒的可重用modal dialog。 我发现了一些例子,但我必须说那些不像我喜欢它们那样“漂亮”。

这一个: WPFmodal dialog (没有mvvm – >没用)

这非常好: 在使用MVVM模式时显示Dialogs (但它仍然使用我不需要的自制ServiceLocator,因为我正在使用IUnity容器。我可以使用逻辑并将其重写为Unity但这不是“漂亮的” “我诚实的看法。

好吧,经过一段时间在网上搜索信息,一些博客(现在找不到源代码)告诉我,PRISM框架有一个叫做“交互请求”的东西。 所以我查看了prism文档并在“高级mvvm场景”主题下找到了一小部分,但文档中给出的信息还不够。

我想知道是否有人有任何好的例子或任何好的博客文章,关于如何用mvvm在prism wpf中实现一个很棒的modal dialog。

编辑 :关于评论中的问题:

是什么让模态对话变得棒极了?

确实是个好问题。

  1. 它必须是模态的(当对话框打开时,UI的其余部分应该被冻结)
  2. 对话框视图可以拥有自己的viewmodel,或者至少我想将对象的实例提供给对话框视图并将对象返回给父视图
  3. 视图应该是一个自己的“xaml”文件
  4. .NET中的dialogresultfunction,或者至少是一种获取用户在对话框中单击的响应的方法

PRISM 5.0提出了快速解决方案来显示modal dialog。 使用PopupWindowAction。

        

交互请求需要更多的前期工作,但它们绝对是从MVVM纯粹主义角度出发的正确方法……

我在Karl Shifflett的MVVM In The Box训练扩展中看到了如何使用Prism做到这一点的一个例子。

我记得,这个例子在边缘非常粗糙,但它应该让你朝着正确的方向前进。

这种视图“对话框”的问题是它不允许对话框超出父窗口的范围。 从好的方面来说,你可以做很多花哨的布局和动画。

从这里查看我的post

它的简单,它的mvvm,它的服务和你在viewmodel中“你所要做的一切”是:

 var result = this.uiDialogService.ShowDialog("Dialogwindow title goes here", dialogwindowVM); 

警告:我没有使用过PRISM,我的回答是假设只使用WPF和MVVM。 我不认为这是一个主要问题,因为没有PRISM可以满足您的要求列表(无论如何可以在以后的基础解决方案中添加)。

我在Github上有一个项目,它提供了一个名为ModalContentPresenter的自定义FrameworkElement,允许显示模态内容。 该元素基本上由两个窗格组成,一个层叠在另一个窗格之上。 后窗格托管您的主要内容,前窗格托管您的模态内容。 该元素具有依赖项属性,该属性控制是否显示模式内容。

该元素仅提供基本的“模态”function,并且能够托管任意内容(如大多数WPF控件)。 例如,如果您正在显示的模态内容的外观和行为类似于窗口(具有标题,关闭按钮,鼠标拖动等),那么您仍然需要做一些工作。

以下是ModalContentPresenter如何满足您的要求:

它必须是模态的(当对话框打开时,UI的其余部分应该被冻结)

ModalcontentPresenter可以放置在可视层次结构中的任何级别,并且模式内容后面的任何内容(显示时)都将无法访问 。 控件仍将启用,并仍将对它们绑定的viewModel中的任何更改做出反应,但用户将无法使用鼠标和键盘导航并与控件交互。

对话框视图可以拥有自己的viewmodel,或者至少我想将对象的实例提供给对话框视图并将对象返回给父视图。

此Stackoverflow答案显示了我将如何建议您实现此目的。

视图应该是一个自己的“xaml”文件

可以使用内联xaml或单独的xaml文件(例如UserControl )来定义主要内容和模态内容。

.NET中的dialogresultfunction,或者至少是一种获取用户在对话框中单击的响应的方法

上面的链接答案显示了如何从模态内容中获得“答案”。 基本前提是您的viewModel正常通信(直接或通过其他方式,如事件总线)。 唯一的区别是您恰好以某种方式显示您的内容,这意味着用户只能与“模态”数据进行交互。