2017-02-28 153 views
0

我想要一个Prism MVVM应用程序和一个配置文件,我可以根据需要定义哪些模块在预定义区域中加载。Prism MVVM:通过配置文件按需加载模块

所以,如果我点击一个按钮,它应该检查配置文件,并加载一个模块,并将其放入特定区域。

PRISM Modularity Quickstart这将是ModuleE的权利?

有人可以举一个小例子吗?

编辑: 我有这个至今:

MainWindow.xaml

<Window x:Class="MmuTest2.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 Margin="10"> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="*" /> 
      <RowDefinition Height="*" /> 
     </Grid.RowDefinitions> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="*" /> 
      <ColumnDefinition Width="*" /> 
     </Grid.ColumnDefinitions> 
     <ItemsControl Grid.Row="0" 
         Grid.Column="0" 
         prism:RegionManager.RegionName="ModuleA" /> 
     <ItemsControl Grid.Row="0" 
         Grid.Column="1" 
         prism:RegionManager.RegionName="ModuleB" /> 
     <ItemsControl Grid.Row="1" 
         Grid.Column="0" 
         prism:RegionManager.RegionName="ModuleC" /> 
     <Button 
      Grid.Row="1" 
      Grid.Column="1" 
      Command="{Binding LoadCommand}">Load Modules on demand</Button> 
    </Grid> 

</Window> 

MainWindowViewModel.cs

using System; 
using System.Windows; 
using System.Windows.Input; 
using System.Windows.Threading; 
using Prism.Commands; 
using Prism.Modularity; 
using Prism.Mvvm; 

namespace MmuTest2.ViewModels 
{ 
    public class MainWindowViewModel : BindableBase 
    { 
     private string _title = "Prism Unity Application"; 

     public string Title 
     { 
      get { return _title; } 
      set { SetProperty(ref _title, value); } 
     } 

     public MainWindowViewModel() 
     { 

      this.LoadCommand = new DelegateCommand(
       () => { 

        // Load Modules! 

       }, 
       () => true 
      ); 
        } 

     public ICommand LoadCommand { get; private set; } 
    } 
} 

ModuleA.cs

using Prism.Modularity; 
using Prism.Regions; 
using System; 

namespace ModuleA 
{ 
    [Module(ModuleName = "ModuleA")] 
    public class ModuleA : IModule 
    { 
     IRegionManager _regionManager; 

     public ModuleA(RegionManager regionManager) 
     { 
      _regionManager = regionManager; 
     } 

     public void Initialize() 
     { 
      this 
      ._regionManager 
      .RegisterViewWithRegion("ModuleA", typeof(Views.ModuleAView)); 
     } 
    } 
} 

Bootstrapper.cs

using System; 
using Microsoft.Practices.Unity; 
using Prism.Unity; 
using MmuTest2.Views; 
using System.Windows; 
using Prism.Modularity; 

namespace MmuTest2 
{ 
    class Bootstrapper : UnityBootstrapper 
    { 
     protected override DependencyObject CreateShell() 
     { 
      return Container.Resolve<MainWindow>(); 
     } 

     protected override void InitializeShell() 
     { 
      Application.Current.MainWindow.Show(); 
     } 

     protected override IModuleCatalog CreateModuleCatalog() 
     { 
      ModuleCatalog catalog = new ConfigurationModuleCatalog(); 
      return catalog; 

     } 

     protected override void ConfigureModuleCatalog() 
     { 
      ModuleCatalog moduleCatalog = (ModuleCatalog)this.ModuleCatalog; 
      moduleCatalog.AddModule(typeof(ModuleA.ModuleA)); 
     } 
    } 
} 

EDIT2: 我发现了一个quick and dirty way加载经由目录监控动态模块。 现在我只需要一种方法来指定新模块应该通过配置文件显示在哪个区域。

+0

您已经发布了大量的代码,但没有采取任何的代码,试图解决您的问题。如果你知道如何从配置文件中读取信息,那么你应该可以做到这一点。 –

回答