VB のたまご

作成日: 2017/05/14, 更新日: 2017/05/14



Module4

  •  引き続き、モジュールの読み込み方法です。 今回は、コンフィグファイルに、モジュール情報が含まれた dll ファイルの指定、モジュール名の登録などを書いておいて、 コンフィグファイルを読み込んでモジュールカタログに登録する方法を学習します。

  • スポンサーリンク


  •  以下は、App.config に書いたサンプルです。 最初に、コンフィグファイルを読み込むクラスの型とセクション名「modules」を登録します。 続いて、「modules」セクションでは、モジュール情報が含まれた dll やその中に含まれているモジュール名などを登録します。

  • <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
    
      <configSections>
        <section name="modules" type="Prism.Modularity.ModulesConfigurationSection, Prism.Wpf" />
      </configSections>
    
      <modules>
        <module assemblyFile="ClassLibrary1.dll" moduleType="ClassLibrary1.ClassLibrary1Module, ClassLibrary1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" moduleName="ClassLibrary1Module" startupLoaded="True" />
      </modules>
    
      <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
      </startup>
      
    </configuration>
    

  •  後は、ブートストラッパー内で、コンフィグファイルからモジュール情報を登録するように命令するだけです。

  • Protected Overrides Function CreateModuleCatalog() As IModuleCatalog
        Return New ConfigurationModuleCatalog
    End Function
    

  •  こちらも実行することで、ユーザーコントロールが表示されます。

  •  それでは、ソース全体です。

  •  モジュールプロジェクト
  •  画面クラスのコードビハインドには、名前空間の追加以外、処理はありません。

  •  AView.xaml

  • <UserControl x:Class="Views.AView"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
                 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
                 xmlns:local="clr-namespace:ClassLibrary1.Views"
                 mc:Ignorable="d" 
                 d:DesignHeight="300" d:DesignWidth="300">
        
        <Grid>
            <TextBlock Text="View A" FontSize="40" />
        </Grid>
        
    </UserControl>
    

  •  ClassLibrary1Module.vb

  • Imports Prism.Regions
    Imports Prism.Modularity
    Imports ClassLibrary1.Views
    Imports Microsoft.Practices.Unity
    
    Public Class ClassLibrary1Module
        Implements IModule
    
        <Dependency>
        Public Property Manager As IRegionManager
    
        Public Sub Initialize() Implements IModule.Initialize
    
            Me.Manager.RegisterViewWithRegion("ContentRegion", GetType(AView))
    
        End Sub
    
    End Class
    

  •  続いて、WPF アプリケーションプロジェクト
  •  画面クラスのコードビハインドには、名前空間の追加以外、処理はありません。

  •  Window1.xaml

  • <Window x:Class="Views.Window1"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:WpfApplication1.Views"
            xmlns:prism="http://prismlibrary.com/"
            mc:Ignorable="d"
            Title="Window1" Height="350" Width="525">
    
        <Grid>
    
            <ContentControl prism:RegionManager.RegionName="ContentRegion" />
    
        </Grid>
    
    </Window>
    

  •  App.config

  • <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
    
      <configSections>
        <section name="modules" type="Prism.Modularity.ModulesConfigurationSection, Prism.Wpf" />
      </configSections>
    
      <modules>
        <module assemblyFile="ClassLibrary1.dll" moduleType="ClassLibrary1.ClassLibrary1Module, ClassLibrary1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" moduleName="ClassLibrary1Module" startupLoaded="True" />
      </modules>
    
      <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
      </startup>
      
    </configuration>
    

  •  Bootstrapper.vb

  • Imports Microsoft.Practices.Unity
    Imports Prism.Unity
    Imports Prism.Modularity
    Imports WpfApplication1.Views
    
    Public Class Bootstrapper
        Inherits UnityBootstrapper
    
        ' Shell 担当になる View のインスタンスを返却
        Protected Overrides Function CreateShell() As DependencyObject
            Return Me.Container.Resolve(Of Window1)
        End Function
    
        ' Shell 担当になる View を表示
        Protected Overrides Sub InitializeShell()
            Application.Current.MainWindow.Show()
        End Sub
    
        ' App.config ファイルからモジュール情報を読み取って登録する
    
        ' →あらかじめ、dll 等の実行ファイルを指定パスに配置しておく必要あり
        ' 今回は、ClassLibrary1 プロジェクトのビルドイベントで上書きコピーするように設定
        ' ソリューションエクスプローラー
        '  → ClassLibrary1
        '  → My Project をダブルクリック、または右クリックのプロパティ
        '  → コンパイルタブ
        '  → 画面右下あたり?にある、ビルドイベント
        '  → ビルド後イベントのコマンドライン
        ' xcopy "$(TargetDir)*.*" "$(SolutionDir)\$(SolutionName)\$(OutDir)" /Y
        Protected Overrides Function CreateModuleCatalog() As IModuleCatalog
            Return New ConfigurationModuleCatalog
        End Function
    
    End Class
    

  •  Application.xaml.vb
  •  ※Application.xaml では、【StartupUri="MainWindow.xaml"】を削除しています。

  • Class Application
    
        ' Startup、Exit、DispatcherUnhandledException などのアプリケーション レベルのイベントは、
        ' このファイルで処理できます。
    
        Protected Overrides Sub OnStartup(e As StartupEventArgs)
            MyBase.OnStartup(e)
    
            ' Unity 管理による Prism アプリケーションの起動制御処理を実行
            Dim boot = New Bootstrapper
            boot.Run()
    
        End Sub
    
    End Class