WPF+Prism+LiveCharts 搭建WPF开发框架
文章目录
前言
提示:这里可以添加本文要记录的大概内容:
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。
提示:以下是本篇文章正文内容
Prism
关于Prism的详细介绍如下
- 遵循设计模式,提升代码可维护性
MVVM 模式的有效应用:Prism 以 MVVM 模式为核心,将视图(View)和业务逻辑(ViewModel)分离。视图专注于界面展示,ViewModel 负责处理业务逻辑和数据交互。这种分离使得代码结构清晰,易于理解和维护。例如,当需要修改界面布局时,只需关注视图层的 XAML 代码,而不会影响到业务逻辑;反之,修改业务逻辑时也不会对视图造成影响。
依赖注入原则:Prism 支持依赖注入(Dependency Injection,DI),通过使用容器(如 Unity、Autofac 等)来管理对象的创建和生命周期。依赖注入使得组件之间的耦合度降低,提高了代码的可测试性和可维护性。例如,在 ViewModel 中需要使用某个服务时,只需通过构造函数注入该服务,而不需要在 ViewModel 内部直接创建服务实例,这样在测试时可以轻松替换服务的实现。 - 实现模块化开发,增强项目扩展性
模块的划分与管理:Prism 允许将应用程序划分为多个独立的模块,每个模块可以包含自己的视图、ViewModel、服务等。模块之间通过接口进行通信,降低了模块之间的耦合度。例如,一个大型的企业级应用可以划分为用户管理模块、订单管理模块、报表模块等,每个模块可以独立开发、测试和部署,当需要添加新功能时,只需开发新的模块并集成到应用程序中即可。
模块的动态加载:Prism 支持模块的动态加载,即可以在应用程序运行时根据需要加载或卸载模块。这对于一些需要根据用户权限或业务需求动态扩展功能的应用非常有用。例如,对于不同角色的用户,应用程序可以只加载该用户有权限使用的模块,提高了应用程序的灵活性和性能。 - 提供导航服务,优化用户体验
统一的导航机制:Prism 提供了强大的导航服务,使得在不同视图之间进行导航变得简单和统一。通过使用导航服务,开发者可以在 ViewModel 中轻松实现页面的跳转,而不需要在视图层编写复杂的导航逻辑。例如,在一个多页面的应用程序中,用户点击某个按钮后需要跳转到另一个页面,只需在对应的 ViewModel 中调用导航服务的方法即可实现。
导航参数的传递:Prism 的导航服务支持传递参数,使得在不同视图之间传递数据变得方便。例如,在一个商品列表页面点击某个商品后,需要跳转到商品详情页面并显示该商品的详细信息,这时可以通过导航参数将商品的 ID 传递到商品详情页面的 ViewModel 中,然后在 ViewModel 中根据商品 ID 从数据库或服务中获取商品的详细信息。 - 事件聚合器机制,促进组件间通信
松耦合的通信方式:Prism 的事件聚合器(Event Aggregator)提供了一种松耦合的组件间通信方式。不同的模块或组件可以通过事件聚合器发布和订阅事件,而不需要直接引用对方。例如,在一个购物车应用中,当商品添加到购物车时,购物车模块可以通过事件聚合器发布一个 “商品添加到购物车” 的事件,而订单统计模块可以订阅该事件,当事件发生时更新订单统计信息。
跨模块通信的支持:事件聚合器使得不同模块之间的通信变得简单和灵活。在大型应用程序中,不同模块可能位于不同的程序集或项目中,使用事件聚合器可以方便地实现跨模块的消息传递,提高了应用程序的整体协作性。 - 丰富的开发资源和社区支持
大量的示例和文档:Prism 拥有丰富的官方文档和示例代码,这些资源可以帮助开发者快速上手和掌握 Prism 的使用。无论是初学者还是有经验的开发者,都可以通过官方文档和示例代码了解 Prism 的各种功能和最佳实践。
活跃的社区:Prism 有一个活跃的开源社区,开发者可以在社区中交流经验、分享代码、解决问题。社区中还会不断涌现出各种扩展和插件,进一步丰富了 Prism 的功能和应用场景。
前置
1、先创建一个项目,然后新建好文件夹与安装好依赖

创建好后,添加引用。注意版本选择的是DryIoc。依赖注入的版本。

引入后还需要配置一下。原框架是Application。修改前后如下:


接着修改app.xaml.cs文件(这里继承PrismApplication可以是因为PrismApplication其实就是继承了Application)

修改完运行,可能会跳出来2个窗口,因为系统还有个默认的启动页面,禁止即可。这一行删掉就行。再运行就一个窗口了。

一、区域
1、创建Views 和 ViewModels文件夹。里面分别存放用户控件和模型。命名是prism框架要求,必须。


这里页面与模型绑定有2个办法。
-
一个是按照prism的命名规则,进行绑定。
即在页面上引入prism后设置 prism:ViewModelLocator.AutoWireViewModel=“True”。就会根据
UCA》UCAViewModel 自定绑定

这里需要将系统自带的MainWindow.xaml删除 ,在views文件夹下面新建一个同名的。这样命名空间就处在一个文件夹下

-
另一个方法是需要在App.xaml.cs里面手动绑定视图模型,这样可以不要用按照规则来命名。
如下:

2、绑定属性
在绑定的对应视图模型里面,继承BindableBase类后可以创建绑定属性(快捷创建 propfull tab tab)
RaisePropertyChanged() 方法要加上
MainWindowViewModel代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Controls;
using WpfApp1.Views;
namespace WpfApp1.ViewModels
{
public class MainWindowViewModel:BindableBase
{
//定义代理命令(参数是string类型)
public DelegateCommand<string> ShowContentCmm { get; set; }
/// <summary>
/// 构造函数
/// </summary>
public MainWindowViewModel()
{
//实例化
ShowContentCmm = new DelegateCommand<string>(ShowContentCmmFun);
}
//绑定属性
/// <summary>
/// 显示内同
/// </summary>
private UserControl _ShowContent;
public UserControl ShowContent
{
get { return _ShowContent; }
set { _ShowContent = value;
//双向绑定,数据改变通知页面 MVVM
RaisePropertyChanged();
}
}
/// <summary>
/// 显示内容的命令
/// </summary>
/// <param name="pageName"></param>
public void ShowContentCmmFun(string pageName) {
if (pageName == "UCA") {
ShowContent = new UCA();
}
if (pageName == "UCB")
{
ShowContent = new UCB();
}
if (pageName == "UCC")
{
ShowContent = new UCC();
}
}
}
}
界面上

以上代码准备好,可以运行好后。开始使用区域
3、区域使用
将上面三个if判断的模块修改。进行解耦
将ABC三个用户控件注入到一个地方。其他视图模型想要哪个,就自己拿哪个就行了。
1、先将三个空间注入导航里面

2、方法内从区域管理里面通过导航取出

3、页面上要绑定区域名字与模型里面一致

运行后效果一致,但是实现了解耦的操作
二、模块化
就是为了引用别人的dll或者程序集
1、根据区域的代码 创建新的WPF程序 模块A 模块B.并修改输出属性
新建后 将输出类型改为类库,然后将自带的文件全部删除。(我这里名字打错了 应该是ModuleA和ModuleB 而不是model)
为什么不直接创建类库,是因为要在模块里面新增窗口,用户控件等。直接创建类库不支持。不知道以后可不可以

文件目录依旧创建Views和 ViewModels。与之前一致,并且安装prism.DryIoc的包
- 要再2个类库下面各自新建一个生成文件。ModuleAProfile 和ModuleBProfile。名称无所谓
在类里面继承prism的模块接口IModule并且要实现接口

2、如何引用。直接项目的引用就不演示了,直接演示引用dll
1、重新生成moduleA和B 后 打开文件夹位置 找到dll文件
2、在主项目里面创建modules文件夹,将2个dll放进去。并且都是始终复制


3、重写IModuleCatalog方法

运行后即可

3、调试
调试的时候 还是要直接引入项目比较好调试
引入项目是
1、添加项目引用
2、重写ConfigureModuleCatalog方法

在里面新增模块的加载文件即可。运行起来就可以打断点调试

4256




被折叠的 条评论
为什么被折叠?



