18 Prism对话服务

18Prim对话服务

接17Prism导航功能

18 Prism对话服务_第1张图片

ViewC.xaml

<Grid>
        <TextBlock Text="我是弹窗"
                   FontSize="80" />
    </Grid>

这种会实例生成,这种不好,接下来用依赖注入的方式来写对话服务。

定义模块

18 Prism对话服务_第2张图片

ViewC.xaml

<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

MainWindowViewModel.cs

这里放出#完整代码#​

删除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");
        }

ViewC.xaml和ViewCViewModel.cs增加按钮逻辑和绑定

ViewC.xaml

    <Button
                Width="100"
                Height="40"
                Command="{Binding CancleCommand}"
                Content="取消" />
            <Button  Width="100"
                     Height="40"
                     Command="{Binding SaveCommand}"
                     Content="确定" />

ViewCViewModel.cs这里放出#完整代码#​​


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");
        }
    }
}

参考


  1. WPF中RegisterTypes方法是什么

    在WPF中,RegisterTypes​​方法是Unity​容器的一个扩展方法,用于向容器注册类型和对应的依赖关系。通过该方法注册的类型可以实现依赖注入的功能,即在运行时动态地将依赖的对象注入到目标对象中,从而实现松耦合、可测试和可重用的代码。

    具体来说,RegisterTypes方法接受一个类型映射器(TypeMapping)作为参数,该映射器可用于配置容器的注册规则。通过映射器指定需要注册的类型和对应的实现类,并可以通过属性注入、构造函数注入等方式配置依赖项的解析规则。例如,以下代码演示了如何使用RegisterTypes方法注册一个服务接口和对应的实现类:

    container.RegisterTypes(
       AllClasses.FromAssembliesInBasePath(),
       WithMappings.FromMatchingInterface,
       WithName.Default,
       WithLifetime.ContainerControlled);
    

    在上述代码中,容器将扫描程序集中的所有类,并通过名称匹配规则找到所有实现服务接口的类,然后将其注册为服务接口的实现类,并指定容器控制的生命周期。接下来就可以使用容器来解析服务接口,从而得到其对应的实现类:

    var service = container.Resolveiservice();
    

    这样,Unity容器会自动地将服务接口的实现类注入到目标对象中,从而实现依赖注入的功能。 ↩︎

  2. Prism中RegisterTypes方法是什么

    在使用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​实例。 ↩︎

  3. Prism中RegisterDialog的作用是什么

    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服务进行绑定,从而使得应用程序可以方便地使用和管理对话框。

    ‍ ↩︎

  4. Prism中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框架服务,它可以方便地管理对话框,并使得应用程序更加灵活和易于维护。

    ‍ ↩︎

你可能感兴趣的:(WPF,wpf,c#,开发语言)