VB のたまご

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



Module1

  •  ここでは、モジュールについて学習します。 Region の解説と重複しますが、アプリケーション開発では、1つのまとまりとして扱うよりも、より細分化して機能を小さくした方が、開発しやすくなります。

  • スポンサーリンク


  •  複雑なアプリケーションも、1つ分の機能をクラスライブラリとして独立することで、複数の機能を同時に並行して開発することができるようになります。 この1つ分の機能をモジュールと呼びます。

  • イメージ
  •  Region と組み合わせることで、 最終的に1つの画面に、いろいろな機能を持たせつつ、各機能は追加したり削除したりしやすく(区画名を書くだけだから)、 また、修正もしやすく、メイン画面に影響が無い(区画名しか書いていないから)、というメリットがあります。 ただし、実行するまで画面全体を見られないことがデメリットです。

  •  イメージ図では、1モジュール内に、View, ViewModel, Model を含めていますが、 レイヤー単位、つまり、Aのモジュールには View のまとまり、Bのモジュールには ViewModel のまとまり、 C のモジュールには Model のまとまり、という構成もできます。

  •  それでは、ソースを見ていきましょう。

  •  まずは、モジュールを作成します。 WPF アプリケーションに、クラスライブラリを新規作成して、プロジェクト追加します。 WPF 用のユーザーコントロールを作成できるように、参照設定の追加より、PresentationCore, PresentationFramework, System.Xaml, WindowsBase を追加します。また、NuGet パッケージの管理から Prism.Unity をインストールしておきます。

  •  Views フォルダを作成して、AView という WPF 用のユーザーコントロールクラスを作成します。 コードビハインドで名前空間も追加しておきます。

  • <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>
    

  •  次に、モジュール情報を作成します。 このモジュール情報は、後でブートストラッパー内で、モジュールカタログに登録します。

  •  モジュール情報では、このモジュール内に作ったクラスデータをどう扱うか、指示情報を記載します。 ここでは、ContentRegion 区画に、AView ユーザーコントロールをインジェクションするように指示しています。

  • 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 アプリケーションプロジェクト側では、モジュール(クラスライブラリ)を参照追加して使います。 後は前回同様、画面に区画を作ってインジェクションするだけです。

  • <Window x:Class="Views.Window1"
            
    
        <Grid>
            <ContentControl prism:RegionManager.RegionName="ContentRegion" />
        </Grid>
    
    </Window>
    

  •  ブートストラッパーには、モジュール情報を登録します。

  • Protected Overrides Sub ConfigureModuleCatalog()
    
        Dim catalog = CType(Me.ModuleCatalog, ModuleCatalog)
        catalog.AddModule(GetType(ClassLibrary1Module))
    
    End Sub
    

  •  このサンプルを実行すると、モジュールに作成した View(ユーザーコントロール)が表示されます。

  • スポンサーリンク


  •  以下、ソース全体です。

  •  まずは、モジュール(クラスライブラリ)です。
  •  画面クラスのコードビハインドには、名前空間の追加以外、処理はありません。

  •  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
    
    ' ClassLibrary1 クラスライブラリプロジェクトを作成後、
    ' NuGet パッケージの管理から「Prism.Unity」をインストールします
    ' また、参照追加より以下も参照設定の追加します
    ' ・PresentationCore
    ' ・PresentationFramework
    ' ・System.Xaml
    ' ・WindowsBase
    
    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>
    

  •  Bootstrapper.vb

  • Imports Microsoft.Practices.Unity
    Imports Prism.Unity
    Imports Prism.Modularity
    Imports WpfApplication1.Views
    Imports ClassLibrary1
    
    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
    
        ' モジュールカタログに、ClassLibrary1 プロジェクトに関するモジュール情報(扱い指示書的な)を登録
        ' モジュール情報には、リージョン区画と画面の紐づけ指示やコンテナへの登録などを記載する
        ' シェル画面の一部分に画面をインジェクションして、複合アプリケーションになるように指示したりする
        Protected Overrides Sub ConfigureModuleCatalog()
    
            Dim catalog = CType(Me.ModuleCatalog, ModuleCatalog)
            catalog.AddModule(GetType(ClassLibrary1Module))
    
        End Sub
    
    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