VB のたまご

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



Module2

  •  モジュールには、いくつかの読み込み方法があります。 前回は、起動時にモジュールを読み込ませるように命令しました。 今回は、必要になった時に(オンデマンドで、遅延ロードで)読み込む方法を学習します。 具体的には、ボタンを押してからモジュールを読み込んで表示させます。

  • スポンサーリンク


  •  全体の流れは前回同様なので、変更点だけ説明します。

  •  まずは、メイン画面(Shell)です。ボタンを押したときに、モジュールを読み込ませる処理を作成します。 モジュールを読み込ませるには、IModuleManager クラスの LoadModule メソッドに、「読み込みたいモジュール情報クラス名」を指定します。

  •  Window1.xaml

  • <Window x:Class="Views.Window1"xmlns:prism="http://prismlibrary.com/"
            ~>
    
        <DockPanel LastChildFill="True">
    
            <Button 
                DockPanel.Dock="Top" 
                Content="モジュールのロード" 
                Click="Button_Click" />
            
            <ContentControl prism:RegionManager.RegionName="ContentRegion" />
    
        </DockPanel>
    
    </Window>
    

  •  Window1.xaml.vb

  • Imports Microsoft.Practices.Unity
    Imports Prism.Modularity
    
    Namespace Views ' ←名前空間を追加する
    
        Public Class Window1
    
            <Dependency>
            Public Property Manager As IModuleManager
    
            Private Sub Button_Click(sender As Object, e As RoutedEventArgs)
                Me.Manager.LoadModule("ClassLibrary1Module")
            End Sub
    
        End Class
    
    End Namespace
    

  •  次に、ブートストラッパー内で、モジュール情報の読み込み方法を詳細に登録します。 ここでは、ModuleInfo クラスを使って、モジュール名やアセンブリ名、読み込みモードを指定して登録しています。

  • Protected Overrides Sub ConfigureModuleCatalog()
    
        ' Type クラスから情報取得して登録
        ' プログラム開始時ではなく、必要になった時に初期化する
        ' →ボタンクリックの時にロードする
        Dim moduleType = GetType(ClassLibrary1Module)
        Dim mi = New ModuleInfo With
        {
        .ModuleName = moduleType.Name,
        .ModuleType = moduleType.AssemblyQualifiedName,
        .InitializationMode = InitializationMode.OnDemand
        }
    
        Me.ModuleCatalog.AddModule(mi)
    
    End Sub
    

  •  このサンプルを実行すると、画面表示時はユーザーコントロールは表示されておらず、ボタンを押すことで、ユーザーコントロールが表示されるようになります。

  • スポンサーリンク


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

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

  •  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">
    
        <DockPanel LastChildFill="True">
    
            <Button 
                DockPanel.Dock="Top" 
                Content="モジュールのロード" 
                Click="Button_Click" />
            
            <ContentControl prism:RegionManager.RegionName="ContentRegion" />
    
        </DockPanel>
    
    </Window>
    

  •  Window1.xaml.vb

  • Imports Microsoft.Practices.Unity
    Imports Prism.Modularity
    
    Namespace Views ' ←名前空間を追加する
    
        Public Class Window1
    
            <Dependency>
            Public Property Manager As IModuleManager
    
            Private Sub Button_Click(sender As Object, e As RoutedEventArgs)
                Me.Manager.LoadModule("ClassLibrary1Module")
            End Sub
    
        End Class
    
    End Namespace
    

  •  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
    
        Protected Overrides Sub ConfigureModuleCatalog()
    
            ' Type クラスから情報取得して登録
            ' プログラム開始時ではなく、必要になった時に初期化する
            ' →ボタンクリックの時にロードする
            Dim moduleType = GetType(ClassLibrary1Module)
            Dim mi = New ModuleInfo With
            {
            .ModuleName = moduleType.Name,
            .ModuleType = moduleType.AssemblyQualifiedName,
            .InitializationMode = InitializationMode.OnDemand
            }
    
            Me.ModuleCatalog.AddModule(mi)
    
    
        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