学习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}");
});
}
}