• Prism框架学习


    目录

    一、使用prism框架

    二、prism区域介绍

    一、使用prism框架

    1.建立一个项目,使用.net5.0框架

     2.在nuget中输入prism,然后选择prism.DryIoc安装

    3. 打开App.xaml.cs文件,继承PrismApplication

    1. using Prism.DryIoc;
    2. using System;
    3. using System.Collections.Generic;
    4. using System.Configuration;
    5. using System.Data;
    6. using System.Linq;
    7. using System.Threading.Tasks;
    8. using System.Windows;
    9. namespace WPFPrism
    10. {
    11. /// <summary>
    12. /// Interaction logic for App.xaml
    13. /// </summary>
    14. public partial class App : PrismApplication
    15. {
    16. }
    17. }

    4.打开App.xaml文件,进行引用prism和修改

    1. <prism:PrismApplication x:Class="WPFPrism.App"
    2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    4. xmlns:local="clr-namespace:WPFPrism"
    5. xmlns:prism="http://prismlibrary.com/"
    6. StartupUri="MainWindow.xaml">
    7. <Application.Resources>
    8. </Application.Resources>
    9. </prism:PrismApplication>

    这里把 StartupUri="MainWindow.xaml"删除,否则会启动2个窗口

    5.重新编译后,点击实现抽象类

    1. using Prism.DryIoc;
    2. using Prism.Ioc;
    3. using System;
    4. using System.Collections.Generic;
    5. using System.Configuration;
    6. using System.Data;
    7. using System.Linq;
    8. using System.Threading.Tasks;
    9. using System.Windows;
    10. namespace WPFPrism
    11. {
    12. /// <summary>
    13. /// Interaction logic for App.xaml
    14. /// </summary>
    15. public partial class App : PrismApplication
    16. {
    17. protected override Window CreateShell()
    18. {
    19. //通过容器去拿Window
    20. return Container.Resolve<MainWindow>();
    21. }
    22. protected override void RegisterTypes(IContainerRegistry containerRegistry)
    23. {
    24. //依赖注入的功能,增加依赖注入要实现的内容
    25. }
    26. }
    27. }

    注意:建立项目的时候不要包含.Prism,一开始我就进坑了 

    6. 界面随便拖动一个控件,点击运行,效果

    拓展:

    使用模板建立速度更加的快。

    这里是vs2022

    1.在拓展中搜素prism 

    下载第一个 

    2.进行安装

    3.安装完成,需要重启vs2022,可以选择建立一个空项目

    选择容器

    4.项目文件预览

    使用模板这里已经把需要修改的都修改完了。 

    二、prism区域介绍

     1.首先进行布局

    业务,点击按钮,弹框对应的区域窗体

    1. <Window x:Class="WPFPrism.MainWindow"
    2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    4. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    5. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    6. xmlns:local="clr-namespace:WPFPrism"
    7. mc:Ignorable="d"
    8. Title="MainWindow" Height="450" Width="800">
    9. <Grid>
    10. <Grid.RowDefinitions>
    11. <RowDefinition Height="auto"/>
    12. <RowDefinition />
    13. </Grid.RowDefinitions>
    14. <StackPanel Orientation="Horizontal" >
    15. <Button Content="打开模块A" Margin="5"/>
    16. <Button Content="打开模块B" Margin="5"/>
    17. <Button Content="打开模块C" Margin="5"/>
    18. </StackPanel>
    19. <ContentControl Grid.Row="1" />
    20. </Grid>
    21. </Window>

    2.建立3个窗体

    1. <UserControl x:Class="WPFPrism.Views.ViewA"
    2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    4. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    5. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    6. xmlns:local="clr-namespace:WPFPrism.Views"
    7. mc:Ignorable="d"
    8. d:DesignHeight="450" d:DesignWidth="800">
    9. <Grid>
    10. <TextBlock Text="我是A" FontSize="50"/>
    11. </Grid>
    12. </UserControl>

    A,B,C窗体代码以此类推 

    3. 建立MainViewModle类

    1. using Prism.Commands;
    2. using Prism.Mvvm;
    3. using System;
    4. using System.Collections.Generic;
    5. using System.Linq;
    6. using System.Text;
    7. using System.Threading.Tasks;
    8. namespace WPFPrism.ViewModels
    9. {
    10. public class MainViewModle : BindableBase
    11. {
    12. public DelegateCommand<string> OpenCommand { get; set; }
    13. public MainViewModle()
    14. {
    15. OpenCommand = new DelegateCommand<string>(Open);
    16. }
    17. private void Open(string obj)
    18. {
    19. throw new NotImplementedException();
    20. }
    21. }
    22. }

    4.在主界面增加RegionManager

     <ContentControl Grid.Row="1" prism:RegionManager.RegionName="Content" />

    5.修改MainViewModle类

    1. using Prism.Commands;
    2. using Prism.Mvvm;
    3. using Prism.Regions;
    4. using System;
    5. using System.Collections.Generic;
    6. using System.Linq;
    7. using System.Text;
    8. using System.Threading.Tasks;
    9. using WPFPrism.Views;
    10. namespace WPFPrism.ViewModels
    11. {
    12. public class MainViewModel : BindableBase
    13. {
    14. private readonly IRegionManager regionManager;
    15. public DelegateCommand<string> OpenCommand { get; set; }//创建命令,string用来接收参数,例如ViewA
    16. public MainViewModel(IRegionManager regionManager)//这里点击快速操作。拿界面定义的区域Content
    17. {
    18. OpenCommand = new DelegateCommand<string>(Open);
    19. this.regionManager = regionManager;//拿到这个值
    20. }
    21. private void Open(string obj)
    22. {
    23. regionManager.Regions["Content"].RequestNavigate(obj);//这里需要依赖注入的方式
    24. }
    25. }
    26. }

    注意:

    文件夹下面的的层级,不能少了

    例如:

    <Window x:Class="WPFPrism.Views.MainView">

    不能漏写Views文件夹的名字

    因为MVVM修改代码的时候,不是顺序常规性的,总是前面改了,再改后面,所以导致前面的代码和成型的代码差异很大。

    总体代码结构:

     MainViewModel.cs

    1. using Prism.Commands;
    2. using Prism.Mvvm;
    3. using Prism.Regions;
    4. using System;
    5. using System.Collections.Generic;
    6. using System.Linq;
    7. using System.Text;
    8. using System.Threading.Tasks;
    9. using WPFPrism.Views;
    10. namespace WPFPrism.ViewModels
    11. {
    12. public class MainViewModel : BindableBase
    13. {
    14. private readonly IRegionManager regionManager;
    15. public DelegateCommand<string> OpenCommand { get; set; }//创建命令,string用来接收参数,例如ViewA
    16. public MainViewModel(IRegionManager regionManager)//这里点击快速操作。拿界面定义的区域Content
    17. {
    18. OpenCommand = new DelegateCommand<string>(Open);
    19. this.regionManager = regionManager;//拿到这个值
    20. }
    21. private void Open(string obj)
    22. {
    23. regionManager.Regions["Content"].RequestNavigate(obj);//这里需要依赖注入的方式
    24. }
    25. }
    26. }

    MainView.xaml    

    1. <Window x:Class="WPFPrism.Views.MainView"
    2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    4. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    5. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    6. xmlns:prism="http://prismlibrary.com/"
    7. prism:ViewModelLocator.AutoWireViewModel="True"
    8. xmlns:local="clr-namespace:WPFPrism"
    9. mc:Ignorable="d"
    10. Title="MainView" Height="450" Width="800">
    11. <!--自动关联AutoWireViewModel-->
    12. <Grid>
    13. <Grid.RowDefinitions>
    14. <RowDefinition Height="auto"/>
    15. <RowDefinition />
    16. </Grid.RowDefinitions>
    17. <StackPanel Orientation="Horizontal" >
    18. <Button Content="打开模块A" Margin="5" Command="{Binding OpenCommand}" CommandParameter="ViewA"/>
    19. <Button Content="打开模块B" Margin="5" Command="{Binding OpenCommand}" CommandParameter="ViewB"/>
    20. <Button Content="打开模块C" Margin="5" Command="{Binding OpenCommand}" CommandParameter="ViewC"/>
    21. </StackPanel>
    22. <ContentControl Grid.Row="1" prism:RegionManager.RegionName="Content" />
    23. </Grid>
    24. </Window>

    ViewA.xaml                     B C同理

    1. <UserControl x:Class="WPFPrism.Views.ViewA"
    2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    4. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    5. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    6. xmlns:local="clr-namespace:WPFPrism.Views"
    7. mc:Ignorable="d"
    8. d:DesignHeight="450" d:DesignWidth="800" Background="Red">
    9. <Grid>
    10. <TextBlock Text="我是A" FontSize="50"/>
    11. </Grid>
    12. </UserControl>

    App.xaml  

    1. <prism:PrismApplication x:Class="WPFPrism.App"
    2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    4. xmlns:local="clr-namespace:WPFPrism"
    5. xmlns:prism="http://prismlibrary.com/">
    6. <Application.Resources>
    7. </Application.Resources>
    8. </prism:PrismApplication>

    App.xaml.cs 

    1. using Prism.DryIoc;
    2. using Prism.Ioc;
    3. using System;
    4. using System.Collections.Generic;
    5. using System.Configuration;
    6. using System.Data;
    7. using System.Linq;
    8. using System.Threading.Tasks;
    9. using System.Windows;
    10. using WPFPrism.Views;
    11. namespace WPFPrism
    12. {
    13. /// <summary>
    14. /// Interaction logic for App.xaml
    15. /// </summary>
    16. public partial class App : PrismApplication
    17. {
    18. protected override Window CreateShell()
    19. {
    20. //通过容器去拿MainView,也是启动的地方
    21. return Container.Resolve<MainView>();
    22. }
    23. protected override void RegisterTypes(IContainerRegistry containerRegistry)
    24. {
    25. //依赖注入的功能,增加依赖注入要实现的内容
    26. containerRegistry.RegisterForNavigation<ViewA>(); //containerRegistry.RegisterForNavigation<ViewA>("ViewA的具体名字")自定义,可以这样写;
    27. containerRegistry.RegisterForNavigation<ViewB>();
    28. containerRegistry.RegisterForNavigation<ViewC>();
    29. }
    30. }
    31. }

  • 相关阅读:
    [嵌入式系统开发]利用系统节拍定时器实现LED灯闪烁详细教程及完整代码
    React魔法堂:size-sensor源码略读
    Python3 VSCode 配置
    springboot + nacos + aws secretmanager 做账号密码隐私处理
    Python基础编程入门实例:恺撒密码
    JAVA面经整理(2)
    Go入门-Java学者
    vim 实用快捷键
    JAVA-----集合初解
    C高级 DAY4
  • 原文地址:https://blog.csdn.net/u012563853/article/details/124987710