安装Prism.DryIoc库:

Prism的区域和模块化:
一个区域可以显示一个用户控件
一个模块就是一个项目,也就是一个类库
动态切换用户控件的案例:
XML
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="auto"/>
<RowDefinition/>
</Grid.RowDefinitions>
<StackPanel Orientation="Horizontal">
<Button Margin="5" Content="打开模块A" Command="{Binding OpenCommand}" CommandParameter="ViewA"/>
<Button Margin="5" Content="打开模块B" Command="{Binding OpenCommand}" CommandParameter="ViewB"/>
<Button Margin="5" Content="打开模块C" Command="{Binding OpenCommand}" CommandParameter="ViewC"/>
</StackPanel>
<ContentControl prism:RegionManager.RegionName="ContentRegion" Grid.Row="1"/>
</Grid>
cs
public partial class App
{
protected override Window CreateShell()
{
return Container.Resolve<MainView>();
}
protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
// 依赖注入
containerRegistry.RegisterForNavigation<ViewA>();
containerRegistry.RegisterForNavigation<ViewB>();
containerRegistry.RegisterForNavigation<ViewC>();
}
}
cs
internal class MainViewModel : BindableBase
{
private readonly IRegionManager regionManager;
public DelegateCommand<string> OpenCommand { get; private set; }
public MainViewModel(IRegionManager regionManager)
{
OpenCommand = new DelegateCommand<string>(Open);
this.regionManager = regionManager;
}
private void Open(string obj)
{
regionManager.Regions["ContentRegion"].RequestNavigate(obj);
}
}
多模块的情况下动态切换一个区域的用户控件:
大部分的代码是和上面一样的
模块A中的ModuleAProfile文件:
cs
namespace ModuleA
{
public class ModuleAProfile : IModule
{
public void OnInitialized(IContainerProvider containerProvider)
{
}
public void RegisterTypes(IContainerRegistry containerRegistry)
{
// 依赖注入
containerRegistry.RegisterForNavigation<ViewA>();
}
}
}
主项目中的App.xaml:
cs
public partial class App
{
protected override Window CreateShell()
{
return Container.Resolve<MainView>();
}
protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
}
protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog)
{
moduleCatalog.AddModule<ModuleAProfile>();
moduleCatalog.AddModule<ModuleBProfile>();
base.ConfigureModuleCatalog(moduleCatalog);
}
}