2017-02-28 9 views
0

プリズムMVVM Appに設定ファイルが必要です。必要に応じて、あらかじめ定義された領域にロードするモジュールを定義できます。プリズムMVVM:設定ファイル経由でオンデマンドでモジュールをロード

ボタンをクリックすると、設定ファイルをチェックし、モジュールをロードして特定の領域に配置する必要があります。

PRISM Modularity Quickstartでは、これはModuleEの権利ですか?

誰かが小さな例を作ることができますか?

EDIT: 私はこれまでのところ、これを持っている:

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

は、あなたは多くのコードを掲示しますが、試してみて、あなたの問題を解決するためのコードで何もしなかったしています。設定ファイルから情報を読み取る方法が分かっているなら、これを行うことができます。 –

答えて

0

設定ファイルをまったく読む必要はありません。準備ができたら、IModuleManagerを使用してモジュールをロードするだけです。 IModuleを実装するクラスは、ビューを領域に注入する役割を担います。

は、これらのサンプルを参照してください。

https://github.com/PrismLibrary/Prism-Samples-Wpf/tree/master/7-Modules%20-%20AppConfig

https://github.com/PrismLibrary/Prism-Samples-Wpf/tree/master/7-Modules%20-%20LoadManual

関連する問題