首页 > 其他分享 >Prism 中区域、模块化、导航功能、对话服务、发布订阅的简单使用

Prism 中区域、模块化、导航功能、对话服务、发布订阅的简单使用

时间:2023-04-03 21:26:43浏览次数:50  
标签:订阅 eventAggregator 模块化 journal private public Prism void

本文演示了 Prism 框架在 WPF 编程中的几个基本功能
环境:Visual Studio 2022

内容

介绍 Prism 几个基本功能,包括区域、模块化、导航功能、对话服务、发布订阅

区域

  1. 可以在 XMAL 中定义某 ContentControl 为 Prism 的区域,并在App中注册模块:
// 这个区域的名字为 ContentRegion
<ContentControl prism:RegionManager.RegionName="ContentRegion" />

protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
    containerRegistry.RegisterForNavigation<ViewC>();
}
  1. 在 ViewModel 的构造函数中传入区域管理器的属性参数:
private readonly IRegionManager regionManager;

public MainViewModel(IRegionManager regionManager)
{
    this.regionManager = regionManager;
}
  1. 在绑定的方法中即可通过区域管理器设置其显示的内容:
// 按钮 绑定了Open方法 传入一个string参数
<Button Margin="10" Command="{Binding OpenCommand}" CommandParameter="ModuleA" Content="Open ModuleA" />

private void Open(string obj)
{
    // 可以在调用这个控件时给其传入参数
    NavigationParameters keys = new NavigationParameters();
    // 使用的是键值对的方式
    keys.Add("Title", "Hello ModuleA");
    // callback是回调函数,在执行完更改区域后会调用,可以获取该命令执行结果
    regionManager.Regions["ContentRegion"].RequestNavigate(obj, callback =>
    {
        if ((bool)callback.Result)
        {
            journal = callback.Context.NavigationService.Journal;
        }
    }, keys);
}
  1. 在区域内要这样实现:
public class ModuleAViewModel : BindableBase, IConfirmNavigationRequest
{
    public ModuleAViewModel()
    {

    }

    private string title;

    public string Title
    {
        get { return title; }
        set { title = value; RaisePropertyChanged(); }
    }

    // 每次重新导航的时候,该实例是否重用
    public bool IsNavigationTarget(NavigationContext navigationContext)
    {
        return true;
    }
    
    // 当从该模块离开时
    public void OnNavigatedFrom(NavigationContext navigationContext) { }

    // 当进入该模块时
    public void OnNavigatedTo(NavigationContext navigationContext)
    {
        // 获取传入的参数
        navigationContext.Parameters.TryGetValue<string>("Title", out title);
    }

    // 确认是否相应导航请求
    public void ConfirmNavigationRequest(NavigationContext navigationContext, Action<bool> continuationCallback)
    {
        bool res = false;
        if (MessageBox.Show("是否跳转页面?", "提示", MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes)
        {
            res = true;
        }
        continuationCallback(res);
    }
}

模块化

  1. 通过强引用导入模块
// 在依赖中引用 dll 并在 App 中重写该方法
protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog)
{
    // 添加引用-> 添加模块
    moduleCatalog.AddModule<ModuleAProfile>();
    moduleCatalog.AddModule<ModuleBProfile>();
    base.ConfigureModuleCatalog(moduleCatalog);
}
  1. 指定目录动态加载,重写该方法,返回指定的目录
protected override IModuleCatalog CreateModuleCatalog()
{
    // 通过目录加载
    return new DirectoryModuleCatalog() { ModulePath = @".\Modules" };
}
  1. 在编写模块时,必须添加XXXProfile文件,并实现IModule接口
public class ModuleAProfile : IModule
{
    public void OnInitialized(IContainerProvider containerProvider)
    {

    }

    // 注册模块
    public void RegisterTypes(IContainerRegistry containerRegistry)
    {
        containerRegistry.RegisterForNavigation<ModuleA, ModuleAViewModel>();
    }
}

导航功能

// 声明一个日志对象
private IRegionNavigationJournal journal;

public MainViewModel(IRegionManager regionManager)
{
    // 实例化
    this.journal = new RegionNavigationJournal();
}

// 上一步
if (journal.CanGoBack)
{
    journal.GoBack();
}

// 记录journal
if ((bool)callback.Result)
{
    journal = callback.Context.NavigationService.Journal;
}

对话服务

  1. 在 ViewModel 的构造函数中传入对话服务的属性参数:
private readonly IDialogService dialogService;

public MainViewModel(IDialogService dialogService)
{
    this.dialogService = dialogService;
}
  1. 在对话框组件的 ViewModel 中实现 IDialogAware 接口
public class ViewDViewModel : IDialogAware
{
    public string Title { get; set; }

    public event Action<IDialogResult> RequestClose;

    public bool CanCloseDialog()
    {
        return true;
    }

    public void OnDialogClosed()
    {

    }

    public void OnDialogOpened(IDialogParameters parameters)
    {

    }
}
  1. 在app中注册对话框组件
protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
    containerRegistry.RegisterDialog<ViewD, ViewDViewModel>();
}
  1. 使用对话服务
private void Alert()
{
    // 其重载的方法也可以传入参数和回调函数
    dialogService.ShowDialog("ViewD");
}

发布订阅

  1. 在 ViewModel 的构造函数中传入发布订阅的属性参数:
private readonly IEventAggregator eventAggregator;

public MainViewModel(IEventAggregator eventAggregator)
{
    this.eventAggregator = eventAggregator;
}
  1. 新建一个类,实现发布订阅的接口,表示传递什么类型的消息
// 表示传递 string 消息
public class EventMessage : PubSubEvent<string>
{
}
  1. 订阅消息
// Subscribe订阅 UnSubscribe 取消订阅
eventAggregator.GetEvent<EventMessage>().Subscribe(message =>
{
    MessageBox.Show(message);
});
  1. 发布消息
eventAggregator.GetEvent<EventMessage>().Publish("Hello");

总结

主要总结了一下区域、模块化、导航功能、对话服务、发布订阅的简单使用,还需要多写多熟练。

作者:chanstic
出处:Prism 中区域、模块化、导航功能、对话服务、发布订阅的简单使用
本作品采用「CC BY-NC-SA 4.0」许可协议进行许可

标签:订阅,eventAggregator,模块化,journal,private,public,Prism,void
From: https://www.cnblogs.com/chanstic/p/17284485.html

相关文章

  • 汇编模块化处理
    ;**********************************************************************TITLE整数求和;**********************************************************************;**********************************************************************;*程序运行平台要求......
  • RabbitMQ 07 发布订阅模式
    发布订阅模式发布订阅模式结构图:比如信用卡还款日临近了,那么就会给手机、邮箱发送消息,提示需要去还款了,但是手机短信和邮件发送并不一定是同一个业务提供的,但是现在又希望能够都去执行,就可以用到发布订阅模式,简而言之就是,发布一次,消费多个。实现这种模式需要用到另一种类型的......
  • 什么是模块化?为什么要模块化
    什么是模块化为什么要模块化模块化是指将一个大的系统或程序分解成独立的模块,每个模块都有自己的功能和接口。在编写代码时,开发人员可以将代码分成多个模块,每个模块只负责特定的任务或功能。这样做的好处是可以提高代码的可重用性、可维护性和可扩展性。下面是一些模块化的好......
  • 8086汇编计算次方,模块化设计
    就是把dw那一行的每个字的数据,求三次方,然后存到dd那一行assumecs:code,ds:datadatasegment dw1,2,3,4,5,6,7,8 dd0,0,0,0,0,0,0,0;;双字,32位dataendscodesegmentmain: movax,data movds,ax callcul;;放到子程序里计算 movax,4c00h int21hcul:......
  • 什么是模块化,为什么要模块化?
     所谓的模块化开发就是封装细节,提供使用接口,彼此之间互不影响,每个模块都是实现某一特定的功能。模块化开发的基础就是函数。模块化开发使代码耦合度降低,模块化的意义在于最大化的设计重用,以最少的模块、零部件,更快速的满足更多的个性化需求。  为什么要模块化。从程序开......
  • 抢先体验Office 365 Copilot 订阅用户可以尝鲜Word Copilot了!
    简介前不久微软宣布将Microsoft365接入GPT-4,当使用Office办公软件(Word、Excel、PowerPoint、Outlook、Teams等)时,在侧边栏上召唤Copilot(直译:副驾驶,它是一款智能聊天机器人......
  • 模块化-更新已经存在的模块的内容
    1.以BasicModule为例,更新BasicModule的部分内容必须要将更新的内容放在BasicModule的Classes文件中版本号+12.提交到BasicModule的远端仓库提交代码并打tag(注意......
  • 模块化:AMD规范
    模块化:AMD规范是席木木啊已于2022-10-0222:11:59修改421收藏分类专栏:Vue文章标签:AMD模块化javascript版权Vue专栏收录该内容41篇文章2订阅订阅专栏......
  • JS模块化写法(转)
    JS模块化写法(转)   一、原始写法模块就是实现特定功能的一组方法。只要把不同的函数(以及记录状态的变量)简单地放在一起,就算是一个模块。functionm1(){......
  • Android中使用EventBus事件发布/订阅框架实现事件传递
    场景EventBusEventBus是一种用于Android的事件发布-订阅总线。它简化了应用程序内各个组件之间进行通信的复杂度,尤其是碎片之间进行通信的问题,可以避免由于使用广播通信而带......