Prism模块化

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" };
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值