安装Prism.DryIoc库:
Prism的区域和模块化:
一个区域可以显示一个用户控件
一个模块就是一个项目,也就是一个类库
动态切换用户控件的案例:
<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>
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>();}
}
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文件:
namespace ModuleA
{public class ModuleAProfile : IModule{public void OnInitialized(IContainerProvider containerProvider){}public void RegisterTypes(IContainerRegistry containerRegistry){// 依赖注入containerRegistry.RegisterForNavigation<ViewA>();}}
}
主项目中的App.xaml:
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);}
}