教程信息:
Github地址: https://github.com/HenJigg
视频项目源代码地址: https://github.com/HenJigg/MyToDoApp
博客地址: https://www.cnblogs.com/zh7791
1. Region
1.1 MainWindow.xaml
<Window x:Class="Region.Views.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:prism="http://prismlibrary.com/"
prism:ViewModelLocator.AutoWireViewModel="True"
Title="{Binding Title}" Height="350" Width="525" >
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition/>
</Grid.RowDefinitions>
<StackPanel Orientation="Horizontal">
<Button Content="ViewA" Margin="10,0" Command="{Binding OpenCommand}" CommandParameter="ViewA"/>
<Button Content="ViewB" Command="{Binding OpenCommand}" CommandParameter="ViewB"/>
</StackPanel>
<ContentControl Grid.Row="1" prism:RegionManager.RegionName="ContentRegion" />
</Grid>
</Window>
1.2 App.xaml.cs
using Prism.Ioc;
using Region.Views;
using System.Windows;
namespace Region
{
/// <summary>
/// Interaction logic for App.xaml
/// </summary>
public partial class App
{
protected override Window CreateShell()
{
return Container.Resolve<MainWindow>();
}
protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
containerRegistry.RegisterForNavigation<ViewA>();
containerRegistry.RegisterForNavigation<ViewB>();
}
}
}
1.3 MainWindowViewModule.cs
using Prism.Commands;
using Prism.Mvvm;
using Prism.Regions;
using System;
namespace Region.ViewModels
{
public class MainWindowViewModel : BindableBase
{
private string _title = "Prism Application";
public string Title
{
get { return _title; }
set { SetProperty(ref _title, value); }
}
private readonly IRegionManager regionManager;
public DelegateCommand<string> OpenCommand { get;private set; }
public MainWindowViewModel(IRegionManager regionManager)
{
OpenCommand = new DelegateCommand<string>(Open);
this.regionManager = regionManager;
}
private void Open(string obj)
{
this.regionManager.Regions["ContentRegion"].RequestNavigate(obj);
}
}
}
1.4 新建“用户控件”ViewA、ViewB
ViewA.xaml
<UserControl x:Class="Region.Views.ViewA"
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:Region.Views"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800">
<Grid>
<TextBlock Text="ViewA" FontSize="60" Background="LightBlue"/>
</Grid>
</UserControl>
ViewB.xaml
<UserControl x:Class="Region.Views.ViewB"
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:Region.Views"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800">
<Grid>
<TextBlock Text="ViewB" FontSize="60" Background="Lime"/>
</Grid>
</UserControl>
2. Module
2.1 MainWindow.xaml
<Window x:Class="Module.Views.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:prism="http://prismlibrary.com/"
prism:ViewModelLocator.AutoWireViewModel="True"
Title="{Binding Title}" Height="350" Width="525" >
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition/>
</Grid.RowDefinitions>
<StackPanel Orientation="Horizontal">
<Button Content="ViewA" Margin="10,0" Command="{Binding OpenCommand}" CommandParameter="ViewA"/>
<Button Content="ViewB" Command="{Binding OpenCommand}" CommandParameter="ViewB"/>
</StackPanel>
<ContentControl Grid.Row="1" prism:RegionManager.RegionName="ContentRegion" />
</Grid>
</Window>
2.2 App.xaml.cs
using Module.Views;
using ModuleA;
using ModuleB;
using Prism.Ioc;
using Prism.Modularity;
using System.Windows;
namespace Module
{
/// <summary>
/// Interaction logic for App.xaml
/// </summary>
public partial class App
{
protected override Window CreateShell()
{
return Container.Resolve<MainWindow>();
}
protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
}
protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog)
{
moduleCatalog.AddModule<ModuleAModule>();
moduleCatalog.AddModule<ModuleBModule>();
base.ConfigureModuleCatalog(moduleCatalog);
}
}
}
2.3 MainWindowViewModule.cs
using Prism.Commands;
using Prism.Mvvm;
using Prism.Regions;
using System;
namespace Region.ViewModels
{
public class MainWindowViewModel : BindableBase
{
private string _title = "Prism Application";
public string Title
{
get { return _title; }
set { SetProperty(ref _title, value); }
}
private readonly IRegionManager regionManager;
public DelegateCommand<string> OpenCommand { get;private set; }
public MainWindowViewModel(IRegionManager regionManager)
{
OpenCommand = new DelegateCommand<string>(Open);
this.regionManager = regionManager;
}
private void Open(string obj)
{
this.regionManager.Regions["ContentRegion"].RequestNavigate(obj);
}
}
}
2.4 新建“类库”ModuleA、ModuleB,在主程序Module中分别引用“ModuleA”、“ModuleB”
ModuleAModule.cs
using ModuleA.Views;
using Prism.Ioc;
using Prism.Modularity;
using Prism.Regions;
namespace ModuleA
{
public class ModuleAModule : IModule
{
public void OnInitialized(IContainerProvider containerProvider)
{
}
public void RegisterTypes(IContainerRegistry containerRegistry)
{
containerRegistry.RegisterForNavigation<ViewA>();
}
}
}