学习Prism

Prism

大佬视频
link
引入Prism.DryIoc

属性变更通知

继承BindableBase

命令

DelegateCommand类型

页面导航 --> IRegionManager

项目结构

项目结构截屏

App.xaml代码

<prism:PrismApplication x:Class="PrismMy.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:PrismMy"
             xmlns:prism="http://prismlibrary.com/"
                   >
    <Application.Resources>
         
    </Application.Resources>
</prism:PrismApplication>

App.xaml.cs代码

using Prism.DryIoc;
using Prism.Ioc;
using PrismMy.Veiws;
using PrismMy.ViewModels;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Threading.Tasks;
using System.Windows;

namespace PrismMy
{
    /// <summary>
    /// Interaction logic for App.xaml
    /// </summary>
    public partial class App : PrismApplication
    {
        protected override Window CreateShell()
        {
            return Container.Resolve<MainWindow>();
        }

        protected override void RegisterTypes(IContainerRegistry containerRegistry)
        {
            containerRegistry.RegisterForNavigation<MainWindow, MainViewModel>();
            containerRegistry.RegisterForNavigation<ViewA, ViewAModel>();
            containerRegistry.RegisterForNavigation<ViewB, ViewBModel>();
            containerRegistry.RegisterForNavigation<ViewC, ViewCModel>();
        }
    }
}

ViewModel代码

 using Prism.Commands;
using Prism.Mvvm;
using Prism.Regions;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace PrismMy
{
    public class MainViewModel:BindableBase
    {
        private readonly IRegionManager regionManager;
        public MainViewModel(IRegionManager regionManager) 
        {
            OpenViewCommand = new DelegateCommand<string>(Open);
            this.regionManager = regionManager;
        }

        private void Open(string name)
        {
            regionManager.Regions["RegionContent"].RequestNavigate(name);
        }

        public DelegateCommand<string> OpenViewCommand { get;set; }
        
    }
}

MainWindow.xaml代码

<Window x:Class="PrismMy.MainWindow"
        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:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:PrismMy"
        xmlns:prism="http://prismlibrary.com/"
        prism:ViewModelLocator.AutoWireViewModel="True"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="30"/>
            <RowDefinition Height="auto"/>
        </Grid.RowDefinitions>
        <StackPanel Orientation="Horizontal">
            <Button Content="ViewA" Width="120" Command="{Binding OpenViewCommand}" CommandParameter="ViewA"/>
            <Button Content="ViewB" Width="120" Command="{Binding OpenViewCommand}" CommandParameter="ViewB"/>
            <Button Content="ViewC" Width="120" Command="{Binding OpenViewCommand}" CommandParameter="ViewC"/>
        </StackPanel>
        <ContentControl Grid.Row="1" prism:RegionManager.RegionName="RegionContent"/>
    </Grid>
</Window>

模块化 --> IModule

子模块程序

正常创建View
子模块输出类型,选择类库

using ModuleB.Views;
using Prism.Ioc;
using Prism.Modularity;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ModuleB
{
    public class ModuleBProFile : IModule
    {
        public void OnInitialized(IContainerProvider containerProvider)
        {
            
        }

        public void RegisterTypes(IContainerRegistry containerRegistry)
        {
            containerRegistry.RegisterForNavigation<ViewB>();
        }
    }
}

主模块程序

App.xaml程序

其他程序和IRegionManager程序类似。

using ModuleB;
using ModuleA;
using Prism.DryIoc;
using Prism.Ioc;
using Prism.Modularity;
using PrismMy.ViewModels;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Threading.Tasks;
using System.Windows;

namespace PrismMy
{
    /// <summary>
    /// Interaction logic for App.xaml
    /// </summary>
    public partial class App : PrismApplication
    {
        protected override Window CreateShell()
        {
            return Container.Resolve<MainWindow>();
        }

        protected override void RegisterTypes(IContainerRegistry containerRegistry)
        {
            containerRegistry.RegisterForNavigation<MainWindow, MainViewModel>();
        }
        protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog)
        {
            moduleCatalog.AddModule<ModuleAProFile>();
            moduleCatalog.AddModule<ModuleBProFile>();
            base.ConfigureModuleCatalog(moduleCatalog);
        }
    }
}

弹窗功能

定义一个私有变量IDialogService
定义一个键值对往来数据DialogParameters
弹窗的ViewModel需要继承并实现接口IDialogAware

MainWindow.xaml代码

<Window x:Class="PrismMy.MainWindow"
        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:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:PrismMy"
        xmlns:prism="http://prismlibrary.com/" d:DataContext="{d:DesignInstance Type=local:MainViewModel}"
        prism:ViewModelLocator.AutoWireViewModel="True"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="30"/>
            <RowDefinition Height="auto"/>
        </Grid.RowDefinitions>
        <StackPanel Orientation="Horizontal">
            <Button Content="ViewC" Width="120" Command="{Binding OpenViewCommand}" CommandParameter="ViewC"/>
        </StackPanel>
        <ContentControl Grid.Row="1" prism:RegionManager.RegionName="RegionContent"/>
    </Grid>
</Window>

MainViewModel.cs代码

using Prism.Commands;
using Prism.Mvvm;
using Prism.Regions;
using Prism.Services.Dialogs;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace PrismMy
{
    public class MainViewModel:BindableBase
    {
        private readonly IDialogService dialogService;

        public DelegateCommand<string> OpenViewCommand { get; set; }
        public MainViewModel(IDialogService dialogService) 
        {
            OpenViewCommand = new DelegateCommand<string>(Open);
            this.dialogService = dialogService;
        }
        void Open(string obj)
        {
            DialogParameters keyValues = new DialogParameters();
            keyValues.Add("Title", "测试弹窗");
            dialogService.ShowDialog(obj, keyValues, callback => 
            {
                if(callback.Result == ButtonResult.OK)
                {
                    string result = callback.Parameters.GetValue<string>("Value");
                }
            });
        }
    }
}

弹窗ViewC.xaml代码 由于借用前面的Module模块代码,所以弹窗View和对应的View Model注册在ModuleAProFile.cs里

containerRegistry.RegisterForNavigation<ViewC,ViewCModel>();注册弹窗代码

<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:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:ModuleA.Views"
             xmlns:prism="http://prismlibrary.com/"
             prism:ViewModelLocator.AutoWireViewModel="True"
             mc:Ignorable="d" 
             d:DesignHeight="250" d:DesignWidth="300">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="auto"/>
            <RowDefinition/>
            <RowDefinition Height="auto"/>
        </Grid.RowDefinitions>
        <TextBlock Text="温馨提示?"/>
        <TextBlock Text="Hello~~~~" Grid.Row="1" VerticalAlignment="Center" FontSize="50"/>
        <StackPanel Orientation="Horizontal" Grid.Row="2" Margin="10">
            <Button Content="取消" Width="50" Height="30" Margin="10" Command="{Binding CancelCommand}"/>
            <Button Content="确认" Width="50" Height="30" Margin="10" Command="{Binding SaveCommand}"/>
        </StackPanel>
    </Grid>
</UserControl>

ViewCModel代码

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.ViewModel
{
    public class ViewCModel : IDialogAware
    {
        public DelegateCommand SaveCommand { get; set; }
        public DelegateCommand CancelCommand { get; set; }  

        public ViewCModel() 
        {
            SaveCommand = new DelegateCommand(Save);
            CancelCommand = new DelegateCommand(Cancel);
        }

        private void Cancel()
        {
            RequestClose?.Invoke(new DialogResult(ButtonResult.No));
        }

        private void Save()
        {
            OnDialogClosed();
        }


        public string Title {get;set;}

        public event Action<IDialogResult> RequestClose;

        public bool CanCloseDialog()
        {
            return true;
        }

        public void OnDialogClosed()
        {
            DialogParameters keyValues = new DialogParameters();
            keyValues.Add("Value", "Hello");
            RequestClose?.Invoke(new DialogResult(ButtonResult.OK, keyValues));
        }

        public void OnDialogOpened(IDialogParameters parameters)
        {
            Title = parameters.GetValue<string>("Title");
        }
    }
}

发布和订阅

添加一个继承PubSubEvent接口的一个类
public class MessageEvent:PubSubEvent

ViewModel.cs代码

  		private readonly IEventAggregator aggregator;
    	public ViewCModel(IEventAggregator aggregator) 
        {
            CancelCommand = new DelegateCommand(Cancel);
            //向MessageEvent发布一个“Hello”消息
            this.aggregator = aggregator;
        }
        //方法中使用
        private void Cancel()
        {
           aggregator.GetEvent<MessageEvent>().Publish("Hello");
           //RequestClose?.Invoke(new DialogResult(ButtonResult.No));
        }

ViewC.xaml代码

接收消息

 public partial class ViewC : UserControl
    {
        public ViewC(IEventAggregator aggregator)
        {
            InitializeComponent();
            aggregator.GetEvent<MessageEvent>().Subscribe(arg =>
            {
                MessageBox.Show($"接收到一个消息:{arg}");
            });
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值