[Windows] Prism 8.0 入门(下):Prism.Wpf 和 Prism.Unity (3)

上面这种注册方式需要依赖 ViewModelLocator 找到对应的 ViewModel,也可以直接注册 View 和对应的 ViewModel:

containerRegistry.RegisterDialog<CreateUserView, CreateUserViewModel>("CreateUser");

有没有发现上面的 CreateUserWindow 变成了 CreateUserView?因为使用 DialogService 的时候,View 必须是一个 UserControl,DialogService 自己创建一个 Window 将 View 放进去。这样做的好处是 View 可以不清楚自己是一个弹框或者导航的页面,或者要用在拥有不同 Window 样式的其它项目中,反正只要实现逻辑就好了。由于 View 是一个 UserControl,它不能直接控制拥有它的 Window,只能通过在 View 中添加附加属性定义 Window 的样式:

<prism:Dialog.WindowStyle> <Style TargetType="Window"> <Setter Property="prism:Dialog.WindowStartupLocation" Value="CenterScreen" /> <Setter Property="ResizeMode" Value="NoResize"/> <Setter Property="ShowInTaskbar" Value="False"/> <Setter Property="SizeToContent" Value="WidthAndHeight"/> </Style> </prism:Dialog.WindowStyle>

最后一步是实现 ViewModel。对话框的 ViewModel 必须实现 IDialogAware 接口,它的定义如下:

public interface IDialogAware { /// <summary> /// 确定是否可以关闭对话框。 /// </summary> bool CanCloseDialog(); /// <summary> /// 关闭对话框时调用。 /// </summary> void OnDialogClosed(); /// <summary> /// 在对话框打开时调用。 /// </summary> void OnDialogOpened(IDialogParameters parameters); /// <summary> /// 将显示在窗口标题栏中的对话框的标题。 /// </summary> string Title { get; } /// <summary> /// 指示 IDialogWindow 关闭对话框。 /// </summary> event Action<IDialogResult> RequestClose; }

一个简单的实现如下:

public class CreateUserViewModel : BindableBase, IDialogAware { public string Title => "Create User"; public event Action<IDialogResult> RequestClose; private DelegateCommand _createCommand; public DelegateCommand CreateCommand => _createCommand ??= new DelegateCommand(Create); private string _userName; public string UserName { get { return _userName; } set { SetProperty(ref _userName, value); } } public virtual void RaiseRequestClose(IDialogResult dialogResult) { RequestClose?.Invoke(dialogResult); } public virtual bool CanCloseDialog() { return true; } public virtual void OnDialogClosed() { } public virtual void OnDialogOpened(IDialogParameters parameters) { UserName = parameters.GetValue<string>("UserName"); } protected virtual void Create() { var parameters = new DialogParameters { { "User", new User{Name=UserName} } }; RaiseRequestClose(new DialogResult(ButtonResult.OK, parameters)); } }

上面的代码在 OnDialogOpened 中读取传入的参数,在 RaiseRequestClose 关闭对话框并传递结果。至此就完成了弹出对话框并获取结果的整个流程。

自定义 Window 样式在 WPF 程序中很流行,DialogService 也支持自定义 Window 样式。假设 MyWindow 是一个自定义样式的 Window,自定义一个继承它的 MyPrismWindow 类型,并实现接口 IDialogWindow:

public partial class MyPrismWindow: MyWindow, IDialogWindow { public IDialogResult Result { get; set; } }

然后调用 RegisterDialogWindow 注册这个 Window 类型。

protected override void RegisterTypes(IContainerRegistry containerRegistry) { containerRegistry.RegisterDialogWindow<MyPrismWindow>(); }

这样 DialogService 将会使用这个自定义的 Window 类型作为 View 的窗口。

7. 结语

这篇文章介绍了如何使用 Prism.Wpf 创建一个 WPF 程序。虽然只介绍了 IDialogService,但其它模块也大同小异,为了让这篇文章尽量简短我舍弃了它们的说明。

如果讨厌 Prism.Wpf 的臃肿,或者需要创建面向多个 UI 平台的项目,也可以只使用轻量的 Prism.Core。

如果已经厌倦了 Prism,可以试试即将发布的 MVVM Toolkit,它基本就是个 MVVM Light 的性能加强版,而且也更时髦。

8. 参考

https://github.com/PrismLibrary/Prism

https://prismlibrary.com/docs/index.html

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwxwyg.html