2017-02-28 152 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

您已經發布了大量的代碼,但沒有采取任何的代碼,試圖解決您的問題。如果你知道如何從配置文件中讀取信息,那麼你應該可以做到這一點。 –

回答