Prism模块化
ModuleA模块,创建项目后设置为类库,项目右键->属性->输出类型->选择类库
1、创建一个Views文件夹(不是必须的)
ModuleAProfile.cs文件
2、创建一个ModuleAProfile.cs文件
public class ModuleAProfile : IModule
{
public void OnInitialized(IContainerProvider containerProvider)
{
}
public void RegisterTypes(IContainerRegistry containerRegistry)
{
//注册创建的ViewA窗口
containerRegistry.RegisterForNavigation<ViewA>();
}
}
ViewA.xaml
3、新建一个ViewA.xaml用户控件文件
<Grid>
<TextBlock Text="ViewA" FontSize="32"></TextBlock>
</Grid>
ViewAViewModel.cs文件
3-1、创建ViewAViewModel.cs文件
public class ViewAViewModel : BindableBase, IConfirmNavigationRequest
{
public ViewAViewModel()
{
}
//拦截请求,是否允许从该视图切换到别的视图
public void ConfirmNavigationRequest(NavigationContext navigationContext, Action<bool> continuationCallback)
{
bool result = false;
if (MessageBox.Show("确认跳转页面吗?","温馨提示标题", MessageBoxButton.YesNo) == MessageBoxResult.Yes)
result = true;
//传递参数,告知是否跳转页面
continuationCallback(result);
}
//当前视图的实例是否被重用
public bool IsNavigationTarget(NavigationContext navigationContext)
{
return true;
}
//切换到别的视图会被触发,可以用来拦截请求
public void OnNavigatedFrom(NavigationContext navigationContext)
{
}
private string title;
public string Title
{
get { return title; }
set { this.title = value; RaisePropertyChanged(); }
}
//接收从外部传递过来的参数
public void OnNavigatedTo(NavigationContext navigationContext)
{
//获取外部传入的值,类型为string,key=Title
Title = navigationContext.Parameters.GetValue<string>("Title");
}
}
4、WpfApp1项目中创建Views文件夹和ViewModels文件夹
5、在Views文件夹中放MainView.xaml(MainWindow.xaml改名称,为了使用Prism框架的自动查找上下文功能)
MainView.xaml文件
<!-- 引入Prism框架的命名空间 -->
xmlns:prism="http://prismlibrary.com/"
<!-- 自动查找上下文ViewModel的,需要文件名称符号规则,比如MainView.xaml和MainViewModel.cs, ViewA.xaml和ViewAViewModel.cs -->
prism:ViewModelLocator.AutoWireViewModel="True"
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="auto"></RowDefinition>
<RowDefinition></RowDefinition>
</Grid.RowDefinitions>
<StackPanel Orientation="Horizontal">
<!-- 绑定MainViewModel中的OpenCommand命令属性,参数为打开的窗口名称 -->
<Button Content="ViewA" Command="{Binding OpenCommand}" CommandParameter="ViewA"></Button>
<Button Content="ViewB" Command="{Binding OpenCommand}" CommandParameter="ViewB"></Button>
</StackPanel>
<!-- prism:RegionManager.RegionName="ContentRegion": 该属性为这个控件区域定义了一个名字 ContentRegion -->
<ContentControl Grid.Row="1" prism:RegionManager.RegionName="ContentRegion"></ContentControl>
</Grid>
6、MainViewModel.cs文件
public class MainViewModel:BindableBase
{
//用于注册页面到ContentControl标签容器中,显示页面
private readonly IRegionManager RegionManager;
//用于触发命令,调用按钮点击事件
public DelegateCommand<string> OpenCommand { get; private set; }
public MainViewModel(IRegionManager regionManager)
{
OpenCommand = new DelegateCommand<string>(OpenView);
this.RegionManager = regionManager;
}
//具体的事件逻辑
private void OpenView(string obj)
{
//向页面传递参数,可以向页面传递参数
//NavigationParameters param = new NavigationParameters();
//param.Add("Title", "hello Prism!");
//RegionManager.Regions["RegionContent"].RequestNavigate(obj, param);
//找到RegionContent标签,向标签注入页面
RegionManager.Regions["RegionContent"].RequestNavigate(obj);
}
}
7、App.xaml文件
<!-- 标签改为 prism:PrismApplication -->
<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"
<!-- 导入Prism框架名称空间 -->
xmlns:prism="http://prismlibrary.com/"
>
<Application.Resources>
</Application.Resources>
</prism:PrismApplication>
8、App.xaml.cs文件
//展示了两种配置模块的方式
public partial class App : PrismApplication
{
protected override Window CreateShell()
{
return Container.Resolve<MainView>();
}
protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
//手动指定View和ViewModel,不使用prism:ViewModelLocator.AutoWireViewModel="True"属性
//该方式常用
//containerRegistry.RegisterForNavigation<MainWindow, MainViewModel>();
}
#if false
protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog)
{
//1、通过代码的方式配置模块
moduleCatalog.AddModule<ModuleAProfile>();
moduleCatalog.AddModule<ModuleBProfile>();
base.ConfigureModuleCatalog(moduleCatalog);
}
#endif
protected override IModuleCatalog CreateModuleCatalog()
{
//2、需要在当前项目下创建一个Modules文件夹,把ModuleA.dll和ModuleB.dll放在该文件夹下
//WpfApp1\bin\Debug下创建Modules文件夹,把下面两个文件放到Modules文件夹
//ModuleA\bin\Debug\ModuleA.dll
//ModuleB\bin\Debug\ModuleB.dll
return new DirectoryModuleCatalog() { ModulePath = @".\Modules" };
}
}