接17Prism导航功能
ViewC.xaml
<Grid>
<TextBlock Text="我是弹窗"
FontSize="80" />
</Grid>
这种会实例生成,这种不好,接下来用依赖注入的方式来写对话服务。
<UserControl
x:Class="ModuleA.Views.ViewC"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:ModuleA.Views"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
d:DesignHeight="450"
d:DesignWidth="800"
mc:Ignorable="d">
<Grid Background="White">
<Grid.RowDefinitions>
<RowDefinition Height="auto" />
<RowDefinition />
<RowDefinition Height="auto" />
</Grid.RowDefinitions>
<TextBlock Text="温馨提示?" />
<TextBlock
Grid.Row="1"
VerticalAlignment="Center"
FontSize="50"
Text="Hello~~~" />
<StackPanel
Grid.Row="2"
Margin="10"
HorizontalAlignment="Right"
Orientation="Horizontal">
<Button Content="取消" />
<Button Content="确定" />
</StackPanel>
</Grid>
</UserControl>
当基本完成ViewC.xaml
时,想到ViewC
也有业务逻辑,写到ViewModel里面,于是创建ViewCViewModel.cs
,在ModuleAProfile.cs
里面写好注册上下文。
public void RegisterTypes(IContainerRegistry containerRegistry)
{
//注册弹窗
containerRegistry.RegisterDialog<ViewC,ViewCViewModel>();
containerRegistry.RegisterForNavigation<ViewA,ViewAViewModel>();
}
```
## **ViewCViewModel.cs**
````csharp
using Prism.Services.Dialogs;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ModuleA.ViewModles
{
public class ViewCViewModel : IDialogAware
{
public string Title { get; set; }
public event Action<IDialogResult> RequestClose;
public bool CanCloseDialog()
{
return true;
}
public void OnDialogClosed()
{
DialogParameters keys = new DialogParameters();
keys.Add("Value","Hello");
RequestClose?.Invoke(new DialogResult(ButtonResult.OK, keys));
}
//接受弹窗过来要打开的参数
public void OnDialogOpened(IDialogParameters parameters)
{
Title = parameters.GetValue<string>("Title");
}
}
}
WPF中RegisterTypes方法是什么1
Prism中RegisterTypes方法是什么2
Prism中RegisterDialog的作用是什么3
Prism中IDialogService是什么4
这里放出#完整代码#
删除17Prism导航功能中的导航,新增IDialogService
using Prism.Commands;
using Prism.Mvvm;
using Prism.Regions;
using Prism.Services.Dialogs;
using System;
using WpfApp3.Views;
namespace WpfApp3.ViewModels
{
public class MainWindowViewModel : BindableBase
{
//
public readonly IDialogService dialogService;
public DelegateCommand<string> OpenCommand { get; private set; }
//声明导航日志
public MainWindowViewModel(IDialogService dialogService)
{
OpenCommand = new DelegateCommand<string>(Open);
this.dialogService = dialogService;
}
private void Open(string obj)
{
DialogParameters keys = new DialogParameters();
keys.Add("Title","测试弹窗");
dialogService.ShowDialog(obj, keys,callback=>
{
if (callback.Result==ButtonResult.OK)
{//接受参数
callback.Parameters.GetValue<string>("value");
}
});
}
}
}
上面有个回调函数返回的结果来源于ViewCViewModel.cs
()中OnDialogClosed()
方法
public void OnDialogClosed()
{
DialogParameters keys = new DialogParameters();
keys.Add("Value","Hello");//返回的结果,名字为Value的变量,值为Hello
RequestClose?.Invoke(new DialogResult(ButtonResult.OK, keys));
}
ViewCViewModel.cs
:当弹窗打开时接受参数,这个Title
来自于MainWindowViewModel.cs
中的Open()
方法
//接受弹窗过来要打开的参数
public void OnDialogOpened(IDialogParameters parameters)
{
Title = parameters.GetValue<string>("Title");
}
<Button
Width="100"
Height="40"
Command="{Binding CancleCommand}"
Content="取消" />
<Button Width="100"
Height="40"
Command="{Binding SaveCommand}"
Content="确定" />
using Prism.Commands;
using Prism.Services.Dialogs;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ModuleA.ViewModles
{
public class ViewCViewModel : IDialogAware
{
public DelegateCommand CancleCommand { get; set; }
public DelegateCommand SaveCommand { get; set; }
public ViewCViewModel()
{
CancleCommand = new DelegateCommand(Cancle);
SaveCommand = new DelegateCommand(Save);
}
private void Save()
{
OnDialogClosed();
}
private void Cancle()
{
RequestClose?.Invoke(new DialogResult(ButtonResult.No));
}
public string Title { get; set; }
public event Action<IDialogResult> RequestClose;
public bool CanCloseDialog()
{
return true;
}
public void OnDialogClosed()
{
DialogParameters keys = new DialogParameters();
keys.Add("Value","Hello");//返回的结果,名字为Value的变量,值为Hello
RequestClose?.Invoke(new DialogResult(ButtonResult.OK, keys));
}
//接受弹窗过来要打开的参数
public void OnDialogOpened(IDialogParameters parameters)
{
Title = parameters.GetValue<string>("Title");
}
}
}
在WPF中,RegisterTypes
方法是Unity
容器的一个扩展方法,用于向容器注册类型和对应的依赖关系。通过该方法注册的类型可以实现依赖注入的功能,即在运行时动态地将依赖的对象注入到目标对象中,从而实现松耦合、可测试和可重用的代码。
具体来说,RegisterTypes方法接受一个类型映射器(TypeMapping)作为参数,该映射器可用于配置容器的注册规则。通过映射器指定需要注册的类型和对应的实现类,并可以通过属性注入、构造函数注入等方式配置依赖项的解析规则。例如,以下代码演示了如何使用RegisterTypes方法注册一个服务接口和对应的实现类:
container.RegisterTypes(
AllClasses.FromAssembliesInBasePath(),
WithMappings.FromMatchingInterface,
WithName.Default,
WithLifetime.ContainerControlled);
在上述代码中,容器将扫描程序集中的所有类,并通过名称匹配规则找到所有实现服务接口的类,然后将其注册为服务接口的实现类,并指定容器控制的生命周期。接下来就可以使用容器来解析服务接口,从而得到其对应的实现类:
var service = container.Resolveiservice();
这样,Unity容器会自动地将服务接口的实现类注入到目标对象中,从而实现依赖注入的功能。 ↩︎
在使用Prism框架时,RegisterTypes方法是在模块初始化时用于将服务添加到容器中的一个接口方法。通过在模块的RegisterTypes方法中将服务注册到容器中,可以使这些服务可以在其他模块和应用程序中使用,从而实现应用程序组件之间的松耦合和可重用性。
具体来说,RegisterTypes方法接受一个IContainerRegistry
对象作为参数,该对象代表Prism
的容器注册表,可用于向容器中注册服务。通过调用IContainerRegistry
的Register
方法或其派生方法,可以将服务添加到容器中。例如,以下代码就展示了如何在RegisterTypes
方法中将一个服务添加到容器中:
public class MyModule : IModule
{
public void RegisterTypes(IContainerRegistry containerRegistry)
{
containerRegistry.Registerimyservice,();
}
}
在上述代码中,容器注册表对象containerRegistry
调用Register
方法将IMyService服务和与之对应的MyServiceImpl
类注册到容器中。这样,通过依赖注入,就可以在其他组件中使用该服务。
同时,在使用RegisterTypes
方法时,常常需要使用一些常用的依赖注入标记,如InjectionMember
。该标记可以在服务注册时指定一些额外的属性或参数,以支持更灵活的依赖注入。实际上,Prism
定义了几个常用的InjectionMember
标记,包括ConstructorInjection
、PropertyInjection
、MethodInjection
等。例如,以下代码就演示了如何使用PropertyInjection
标记在注册服务时进行属性注入:
public class MyModule : IModule
{
public void RegisterTypes(IContainerRegistry containerRegistry)
{
containerRegistry.Registerimyservice,(
new PropertyInjection("MyProperty", new MyDependency())
);
}
}
在上述代码中,我们使用了PropertyInjection
标记,在注册IMyService
服务时指定了MyServiceImpl
类的MyProperty
属性需要注入MyDependency
类。这样,在其他组件中使用IMyService
实例时,MyServiceImpl
的MyProperty
属性将自动注入MyDependency
实例。 ↩︎
Prism中RegisterDialog的作用是什么
在Prism框架中,RegisterDialog方法用于向框架注册对话框和对应的视图模型,以便于在应用程序需要时可以方便地显示对话框。通过RegisterDialog方法,我们可以将对话框和视图模型注册到容器中,并将其与框架的IDialogService服务进行绑定。
使用RegisterDialog方法时,我们需要指定对话框类和对话框视图模型类,同时可以通过DialogParameters参数来指定对话框的一些属性,例如标题、大小、动画等。具体来说,以下示例展示了如何使用RegisterDialog方法向框架注册一个对话框:
public class MyModule : IModule
{
public void RegisterTypes(IContainerRegistry containerRegistry)
{
containerRegistry.RegisterDialogmydialog,(
"MyDialog",
new DialogParameters() { { "Title", "My Dialog Title" } }
);
}
}
在上述示例中,我们对MyDialog对话框以及对应的MyDialogViewModel视图模型进行了注册,并指定了对话框的标题为"My Dialog Title"。
在进行对话框操作时,我们可以通过IDialogService服务的Show方法来显示对话框。具体地,以下示例展示了如何在视图模型中使用IDialogService服务初始化并打开刚刚注册的"MyDialog"对话框:
public class SomeViewModel : BindableBase
{
private readonly IDialogService _dialogService;
public SomeViewModel(IDialogService dialogService)
{
_dialogService = dialogService;
}
private void OpenDialog()
{
var result = _dialogService.ShowDialog("MyDialog");
if (result.Result == ButtonResult.OK)
{
// 对话框返回值为OK时执行的操作
}
}
}
在上述示例中,我们在构造函数中注入了IDialogService服务,并在OpenDialog方法中使用ShowDialog方法来打开刚刚注册的MyDialog对话框。
总之,Prism框架中的RegisterDialog方法可以方便地将对话框和对应的视图模型注册到容器中,并与框架的IDialogService服务进行绑定,从而使得应用程序可以方便地使用和管理对话框。
↩︎
在Prism框架中,IDialogService是一个用于管理对话框的服务接口。它提供了一组方法,用于创建、显示和关闭对话框,并支持获取对话框返回的结果。通过IDialogService服务,我们可以方便地在应用程序中使用对话框,并与框架集成,从而使得应用程序更加灵活和易于维护。
IDialogService服务通常是在应用程序的视图模型中使用的。我们可以在视图模型的构造函数中将IDialogService服务注入进来,并在需要的时候调用它的方法来管理对话框。例如,以下示例展示了如何在视图模型中使用IDialogService服务来打开一个标准对话框:
public class MyViewModel : BindableBase
{
private readonly IDialogService _dialogService;
public MyViewModel(IDialogService dialogService)
{
_dialogService = dialogService;
}
private void ShowDialog()
{
var result = _dialogService.ShowDialog("MyDialog");
if (result.Result == ButtonResult.OK)
{
// 对话框返回值为OK时执行的操作
}
}
}
在上述示例中,我们在视图模型的构造函数中注入了IDialogService服务,并在ShowDialog方法中调用了其ShowDialog方法来打开名为"MyDialog"的对话框。在对话框关闭时,我们还可以通过result.Result属性获取对话框返回的结果,以决定下一步的操作。
总之,IDialogService是一个非常有用的Prism框架服务,它可以方便地管理对话框,并使得应用程序更加灵活和易于维护。
↩︎