基于Prism的VisualStudio扩展包模板: Prism Template Pack,下载它后可以快速创建基于Prism的项目。
2.2. 官方学习文档:(以下推荐MSDN,微软的)
https://docs.microsoft.com/en-us/previous-versions/msp-n-p/ff921153(v=pandp.40)
-
Prism框架内容
框架中包括 MVVM、依赖注入、Command、Message Event、导航、弹窗等功能。
-
基本概念
Modules(模块):
模块是可独立开发、测试和(可选)部署的功能包。在许多情况下,模块由单独的团队开发和维护。典型的棱镜应用程序由多个模块构建。模块可用于表示特定的业务相关功能(例如,配置文件管理),并封装实现该功能所需的所有视图、服务和数据模型。模块还可用于封装可用于多个应用程序重复使用的常见应用程序基础架构或服务(例如,记录和例外管理服务)。
Module catalog(模块目录):
在复合应用程序中,模块必须由主机应用程序在运行时间发现并加载。在 Prism 中,模块目录用于指定要加载的模块、加载时间以及按什么顺序加载。模块目录由模块经理和模块加载器组件使用,它们负责在模块处于远程时下载模块,将模块的组件加载到应用程序域中,并初始化模块。Prism 允许以不同的方式指定模块目录,包括程序化地使用代码、声明性地使用 XAML 或使用配置文件。如果需要,您也可以实施自定义模块目录。
Shell(壳):
外壳是主机应用程序,可加载模块。外壳定义了应用程序的整体布局和结构,但它通常不知道它将托管的确切模块。它通常实现通用应用程序服务和基础架构,但应用程序的大部分功能和内容都实现在模块中。外壳还提供顶层窗口或视觉元素,然后托管加载模块提供的不同 UI 组件。
Views(视图):
视图****是 UI 控件,可将 UI 封装为应用程序的特定功能或功能区域。视图与 MVVM 模式一起使用,该模式用于将 UI 与应用程序的演示逻辑和数据之间的问题进行彻底分离。视图用于封装 UI 并定义用户交互行为,从而允许独立于基础应用功能更新或替换视图。视图使用数据绑定与视图模型类进行交互。
View models(视图模型):
视图模型是封装应用程序演示逻辑和状态的类。它们是 MVVM 模式的一部分。查看模型封装了应用程序的大部分功能。查看模型定义属性、命令和事件,视图中的控件可以将这些属性、命令和事件与数据绑定在一起。
Models(模型):
模型类封装应用程序数据和业务逻辑。它们用作 MVVM 模式的一部分。模型封装数据以及任何相关的验证和业务规则,以确保数据一致性和完整性。
Commands(命令):
命令用于封装应用程序功能,使其能够独立于应用程序的 UI 进行定义和测试。它们可以定义为命令对象或视图模型中的命令方法。棱镜提供代表委员会类和复合通信类。后者用于表示所有一起调用的命令集合。
Regions(区域):
命令用于封装应用程序功能,使其能够独立于应用程序的 UI 进行定义和测试。它们可以定义为命令对象或视图模型中的命令方法。棱镜提供代表委员会类和复合通信类。后者用于表示所有一起调用的命令集合。
Navigation(导航):
导航定义为应用坐标因用户与应用程序的交互或内部应用状态更改而更改到其 UI 的过程。棱镜支持两种导航样式:基于状态的导航,其中对现有视图的状态进行更新以实现简单的导航方案,以及创建新视图并在应用程序 UI 中替换旧视图的视图切换导航。视图切换导航使用基于统一资源标识符 (URI) 的导航机制与棱镜区域相结合,以便实施灵活的导航方案。
EventAggregator(事件聚合器):
复合应用程序中的组件通常需要以松散耦合的方式与应用程序中的其他组件和服务进行通信。为了支持这一点,Prism 提供了事件聚合器组件,该组件实施了酒吧子事件机制,从而允许组件发布事件和其他组件来订阅这些事件,而不需要提及其他事件。事件聚合器通常用于允许在不同模块中定义的组件相互通信。
Dependency injection container(依赖性注射容器):
复合应用程序中的组件通常需要以松散耦合的方式与应用程序中的其他组件和服务进行通信。为了支持这一点,Prism 提供了事件聚合器组件,该组件实施了酒吧子事件机制,从而允许组件发布事件和其他组件来订阅这些事件,而不需要提及其他事件。事件聚合器通常用于允许在不同模块中定义的组件相互通信。
Services(服务):
服务是封装非 UI 相关功能的组件,例如记录、异常管理和数据访问。服务可以通过应用程序或模块内定义。服务通常在依赖性注射容器中注册,以便根据需要定位或构建,并由依赖它们的其他组件使用。
Controllers(控制器):
控制器是用于协调在应用程序 UI 区域内显示的意见的构建和初始化的类。控制器封装了确定要显示哪些视图的演示逻辑。控制器将使用 Prism 的视图切换导航机制,该机制提供可扩展的 URI 导航机制,以协调区域内意见的构建和放置。应用控制器模式定义了一个抽象概念,该抽象图映射到此责任。
Bootstrapper(引导器):
控制器是用于协调在应用程序 UI 区域内显示的意见的构建和初始化的类。控制器封装了确定要显示哪些视图的演示逻辑。控制器将使用 Prism 的视图切换导航机制,该机制提供可扩展的 URI 导航机制,以协调区域内意见的构建和放置。应用控制器模式定义了一个抽象概念,该抽象图映射到此责任。
————————————————
rism框架
1、关于Prism框架
官方地址:http://prismlibrary.com
官方源码:https://github.com/PrismLibrary/Prism
版本:8.1
2、功能说明
Prism提供了一组设计模式的实现,有助于编写结构良好的可维护XAML应用程序。
包括MVVM 依赖注入 命令 事件聚合器
Prism减重
Autofac 、Dryloc 、 Mef 、Niniject 、StruyctureMap、Unity。
3、Prism的关键程序
Prism.Core 实现MVVM的核心功能,属于一个与平台无关的项目。
Prism.Wpf 包含了DialogService【弹窗】 Region【注册】 Module 【模块】 Navigation【导航】 其他的一些WPF 功能。
Prism.Unity Prism.Unity.Wpf.dll Prism.Dryloc.Wpf.dll
4、获取Prism框架
Prism.dll Prism.core
Prism.Wpf.dll Prism.Wpf
Prism.Unity.Wpf.dll Prism.Unity
Prism.Dryloc.Wpf.dll Prism.Dryloc
5、数据处理,数据通知的五种方式
新建类:MainViewModel 继承:BindableBase
using Prism.Mvvm;
using System;
using System.Collections.Generic;
using System.Text;
namespace WpfApp2
{
public class MainViewModel : BindableBase
{
private int _value = 100;
public int Value
{
get { return _value; }
set
{
//通知的五种方式
//第一种方式
//SetProperty(ref _value, value);
//第二种方式
//this.OnPropertyChanged(new System.ComponentModel.PropertyChangedEventArgs(“Value”));
//第三种方式
//this.RaisePropertyChanged();
//第四种方式 Value :可以通知其他属性
SetProperty(ref _value, value, “Value”);
//第五种方式
SetProperty(ref _value, value, OnPropertyChanged);
}
}
public void OnPropertyChanged()
{
public MainViewModel()
}
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
xaml代码:
<Window.DataContext>
local:MainViewModel</local:MainViewModel>
</Window.DataContext>
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
6、行为处理
1、Prism的行为处理
DelegateCommand
基本用法 :
新建类:MainViewModel 继承 BindableBase
using Prism.Commands;
using Prism.Mvvm;
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Input;
namespace WpfApp4
{
public class MainViewModel:BindableBase
{
private string _value = “Hellow Word!”;
public ICommand BtnCommand { get => new DelegateCommand(doExecute); }
public string Value
{
get { return _value; }
set {
SetProperty(ref _value, value);
}
}
public MainViewModel()
{
public void doExecute()
this.Value = "Fuck You!";
}
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
检查状态
第一种检查状态:
using Prism.Commands;
using Prism.Mvvm;
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Input;
namespace WpfApp4
{
public class MainViewModel:BindableBase
{
private string _value = “Hellow Word!”;
public DelegateCommand BtncheckCommand { get; }
public string Value
get { return _value; }
set {
SetProperty(ref _value, value);
//触发命令相关的可执行的检查逻辑
BtncheckCommand.RaiseCanExecuteChanged();
public MainViewModel()
BtncheckCommand = new DelegateCommand(doExecute,doCheckExecute);
public void doExecute()
this.Value = "Fuck You!";
public bool doCheckExecute()
return this.Value == "Hellow Word!";
}
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
第二种检查状态:
using Prism.Commands;
using Prism.Mvvm;
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Input;
namespace WpfApp4
{
public class MainViewModel:BindableBase
{
private string _value = “Hellow Word!”;
public DelegateCommand BtncheckCommand { get; }
public string Value
get { return _value; }
set {
SetProperty(ref _value, value);
public MainViewModel()
//ObservesProperty : 监听一个属性的变化,当这个属性值发生变化后,进行状态检查
//当Value发生变化的时候主动去触发一个状态检查
//可以监听多个属性 后面.ObservesProperty(()=>Value)
BtncheckCommand = new DelegateCommand(doExecute, doCheckExecute).ObservesProperty(()=>Value);
public void doExecute()
this.Value = "Fuck You!";
public bool doCheckExecute()
return this.Value == "Hellow Word!";
}
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
第三种检查方式:
using Prism.Commands;
using Prism.Mvvm;
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Input;
namespace WpfApp4
{
public class MainViewModel:BindableBase
{
private string _value = “Hellow Word!”;
public ICommand BtnCommand { get => new DelegateCommand(doExecute); }
public DelegateCommand BtncheckCommand { get; }
public string Value
{
get { return _value; }
set {
SetProperty(ref _value, value);
}
}
private bool _state;
public bool State
get { return Value == "Hellow Word!"; }
set {
SetProperty(ref _state, value);
public MainViewModel()
//第三种检查方式 通过 ObservesCanExecute 进行一个属性值观察,进行动态的状态处理
BtncheckCommand = new DelegateCommand(doExecute).ObservesCanExecute(() => State);
public void doExecute()
this.Value = "Fuck You!";
this.State =!this.State;
}
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
xaml代码:
<Window.DataContext>
local:MainViewModel</local:MainViewModel>
</Window.DataContext>
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
异步处理
using Prism.Commands;
using Prism.Mvvm;
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;
namespace WpfApp4
{
public class MainViewModel:BindableBase
{
private string _value = “Hellow Word!”;
public ICommand BtnAsyncCommand { get => new DelegateCommand(doExecuteAsync); }
public DelegateCommand BtncheckCommand { get; }
public string Value
{
get { return _value; }
set {
SetProperty(ref _value, value);
}
}
public MainViewModel()
public async void doExecuteAsync()
await Task.Delay(5000);
this.Value = "再见!";
}
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
xaml代码:
<Window.DataContext>
local:MainViewModel</local:MainViewModel>
</Window.DataContext>
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
泛型参数
using Prism.Commands;
using Prism.Mvvm;
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;
namespace WpfApp4
{
public class MainViewModel:BindableBase
{
private string _value = “Hellow Word!”;
public ICommand BtnAsyncCommand { get => new DelegateCommand(doExecuteAsync); }
public DelegateCommand BtncheckCommand { get; }
public string Value
get { return _value; }
set {
SetProperty(ref _value, value);
//触发命令相关的可执行的检查逻辑
// BtncheckCommand.RaiseCanExecuteChanged();
public async void doExecuteAsync(string str)
await Task.Delay(5000);
this.Value = str;
}
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
xaml代码:
<Window.DataContext>
local:MainViewModel</local:MainViewModel>
</Window.DataContext>
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
事件命令 [事件转命令] InvokeCommandAction
新建类:MainViewModel:BindableBase
using Prism.Commands;
using Prism.Mvvm;
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;
namespace WpfApp4
{
public class MainViewModel:BindableBase
{
public ICommand BtnEventCommand { get => new DelegateCommand(doEventExecute); }
public void doEventExecute(object args)
{
}
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
xaml代码:
<Window.DataContext>
local:MainViewModel</local:MainViewModel>
</Window.DataContext>
<ComboBox SelectedIndex="0">
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectionChanged">
<prism:InvokeCommandAction Command="{Binding BtnEventCommand}"
TriggerParameterPath=""></prism:InvokeCommandAction>
</i:EventTrigger>
</i:Interaction.Triggers>
<ComboBoxItem Content="111"></ComboBoxItem>
<ComboBoxItem Content="222"></ComboBoxItem>
<ComboBoxItem Content="333"></ComboBoxItem>
<ComboBoxItem Content="444"></ComboBoxItem>
</ComboBox>
</StackPanel>
</Grid>
备注: 顶部引用两个命名空间: xmlns:i="http://schemas.microsoft.com/xaml/behaviors" xmlns:prism="http://prismlibrary.com/" 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. Prism框架引用初始化 PrismBootstrapper 启动器 1、新建Startup 类,继承:PrismBootstrapper
using Prism.Ioc;
using Prism.Unity;
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows;
namespace WpfApp5
{
public class Startup : PrismBootstrapper
{
///
/// 返回一个Shell :主窗口
///
///
///
protected override DependencyObject CreateShell()
{
throw new NotImplementedException();
}
///
///
///
///
///
protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
throw new NotImplementedException();
}
}
}
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
2、将App.xaml代码注释
<Application.Resources>
</Application.Resources>
1. 2. 3. 4. 5. 6. 7. 8. 9. 3、在App.xaml.cs 构造函数中启动
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Threading.Tasks;
using System.Windows;
namespace WpfApp5
{
///
/// Interaction logic for App.xaml
///
public partial class App : Application
{
public App()
{
new Startup().Run();
}
}
}
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
用 PrismApplication 启动器
修改App.xaml代码
<prism:PrismApplication x:Class=“WpfApp1.App”
xmlns=“http://schemas.microsoft.com/winfx/2006/xaml/presentation”
xmlns:x=“http://schemas.microsoft.com/winfx/2006/xaml”
xmlns:local=“clr-namespace:WpfApp1”
xmlns:prism=“http://prismlibrary.com/”>
<Application.Resources>
</Application.Resources>
</prism:PrismApplication>
备注: 引用 xmlns:prism=“http://prismlibrary.com/”
将头尾标签改为 :prism:PrismApplication
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
App.xaml.cs 继承 PrismApplication,代码
using Prism.Ioc;
using Prism.Unity;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Threading.Tasks;
using System.Windows;
namespace WpfApp1
{
///
/// Interaction logic for App.xaml
///
public partial class App : PrismApplication
{
///
/// 返回一个shell 【窗口】
///
///
///
protected override Window CreateShell()
{
return Container.Resolve();
}
protected override void RegisterTypes(IContainerRegistry containerRegistry)
}
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
基于Prism框架的登录跳转
App.xaml代码:
<prism:PrismApplication x:Class=“WpfApp1.App”
xmlns=“http://schemas.microsoft.com/winfx/2006/xaml/presentation”
xmlns:x=“http://schemas.microsoft.com/winfx/2006/xaml”
xmlns:local=“clr-namespace:WpfApp1”
xmlns:prism=“http://prismlibrary.com/”
>
<Application.Resources>
</Application.Resources>
</prism:PrismApplication>
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
App.xaml.cs代码:
using Prism.Ioc;
using Prism.Unity;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Threading.Tasks;
using System.Windows;
namespace WpfApp1
{
///
/// Interaction logic for App.xaml
///
public partial class App : PrismApplication
{
///
/// 返回一个shell 【窗口】
///
///
///
protected override Window CreateShell()
{
return Container.Resolve();
}
///
/// 初始化 shell 主窗口
///
///
protected override void InitializeShell(Window shell)
{
var loginWindow = Container.Resolve();
if (loginWindow == null || loginWindow.ShowDialog() == false)
{
Application.Current.Shutdown();
}
}
protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
}
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
登录代码:Login.xaml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Login.xaml.cs
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
namespace WpfApp1
{
///
/// Login.xaml 的交互逻辑
///
public partial class Login : Window
{
public Login()
{
InitializeComponent();
}
private void Button_Click(object sender, RoutedEventArgs e)
this.DialogResult = true;
}
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
MainWindow.xaml 代码:
</Grid>
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ViewModelLocator对象 帮助进行 View与ViewModel的绑定 标准状态: AutoWireViewModel,默认行为true ViewModel与视图类型位于同一个程序集中 ViewModel位于.ViewModel子命名空间中 视图位于.Views子命名空间中 ViewModel名称与视图名称对应 ,以“ViewModel”结尾 实例代码如下: 新建子文件夹:ViewModels/MainWindowViewModel 类,代码如下:
using Prism.Mvvm;
using System;
using System.Collections.Generic;
using System.Text;
namespace WpfApp6.ViewModels
{
public class MainWindowViewModel : BindableBase
{
private string _value = " Hellow Word";
public string Value
get { return _value; }
SetProperty(ref _value, value);
}
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
新建子文件夹,Views/MainWindow.xaml,代码如下:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
设置启动项:
App.xaml,代码如下:
<prism:PrismApplication x:Class=“WpfApp6.App”
xmlns=“http://schemas.microsoft.com/winfx/2006/xaml/presentation”
xmlns:x=“http://schemas.microsoft.com/winfx/2006/xaml”
xmlns:local=“clr-namespace:WpfApp6”
xmlns:prism=“http://prismlibrary.com/”
>
<Application.Resources>
</Application.Resources>
</prism:PrismApplication>
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
App.xaml.cs,代码如下:
登录后复制
using Prism.Ioc;
using Prism.Unity;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Threading.Tasks;
using System.Windows;
namespace WpfApp6
{
///
/// Interaction logic for App.xaml
///
public partial class App : PrismApplication
{
protected override Window CreateShell()
{
return Container.Resolve<Views.MainWindow>();
}
protected override void RegisterTypes(IContainerRegistry containerRegistry)
模块目录由模块经理和模块加载器组件使用,它们负责在模块处于远程时下载模块,将模块的组件加载到应用程序域中,并初始化模块。棱镜支持两种导航样式:基于状态的导航,其中对现有视图的状态进行更新以实现简单的导航方案,以及创建新视图并在应用程序 UI 中替换旧视图的视图切换导航。复合应用程序中的组件通常需要以松散耦合的方式与应用程序中的其他组件和服务进行通信。通过重复使用单元测试的组件,可以通过依赖性注入在运行时间轻松发现和集成,以及通过使用可在应用程序中重复使用的应用程序级功能封装模块,在应用级别实现重复使用。..
为了满足用户需求,对Newbeecoder.UI开源界面框架项目进行功能扩充,新增数据库轻量级ORM模块、数据访问模型(Model)模块、Excel操作模块、绘图功能。
ORM模块支持Sql Server,MySql,Sqlite等主流数据库。一对多或者多对多的映射关系,能快速连接和操作数据库表,支持多种组合查询和新增,修改数据表。
(Model)模块对数据表字段映射和封装,它提供了服务器端验证,当模型属性上使用这些特性时。可对字符非空,最大长度,值范围,两个属性相同,正则表达式字段验证。
Excel
一、什么是Prism
Prism是一个用于在 WPF、Xamarin Form、Uno 平台和 WinUI 中构建松散耦合、可维护和可测试的 XAML 应用程序框架。
二、官方地址
https://github.com/PrismLibrary/Prism
基于Prism的VisualStudio扩展包模板: Prism Template Pack,下载它后可以快速创建基于Prism的项目。
三、Prism框架内容
框架中包括 MVVM、依赖注入、Command、Message Event、导航、弹窗等功能
首当其冲的,自然是System.Object类了。这里主要想说的是,WPF的大部分代码都是使用托管代码编写,原因是因为CLR的许多不错的特性(如内存管理、错误处理、通用类型系统等。),可以让开发的程序更有效、更健壮。但是,框架并不是所有代码都是托管的,也有一部分是由非托管代码编写。原因主要是因为WPF是展现层框架,它的显示需要和DirectX很紧密的集成起来,进行硬渲染和软渲染,以得到性能上的提升。
下面的结构图中,红色部分是属于WPF框架的。其中,只有milcore这
WPF Prism动态库是一个开放源代码的应用程序开发框架,通过该框架可以使用Microsoft开发的WPF(Windows Presentation Foundation)技术创建灵活,可扩展的应用程序。该框架的核心是一个动态库,其主要功能是对应用程序进行管理和控制,并提供通用的组件和服务,以使应用程序拥有更好的可维护性和可扩展性。
WPF Prism动态库的主要特点在于其模块化的设计,通过将应用程序分割为小的模块,可以实现模块之间的解耦,减少应用程序中模块之间的依赖关系,从而使得应用程序更加易于维护和扩展。另外,该框架还提供了诸多通用的组件和服务,比如事件聚合器、导航管理器、命令管理器等,这些组件和服务可以方便地应用于应用程序中,大大减少了开发人员的工作量。
总之,WPF Prism动态库是一个十分实用的开发框架,它可以简化应用程序的开发过程,提高应用程序的可维护性和可扩展性,同时也是一个十分活跃的开源社区,提供了丰富的文档和支持,便于开发人员进行快速的学习和开发。