VB のたまご

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



Region3

  •  コマンドを学習したので、ちょっと戻って、Region の遷移処理を学習します。 ボタンを押すと、ContentRegion 区画に、SubView ユーザーコントロールをインジェクションする処理です。

  • スポンサーリンク


  •  あらかじめ、ブートストラッパー内で、SubView ユーザーコントロールを Unity コンテナに登録しておきます。

  • Protected Overrides Sub ConfigureContainer()
        MyBase.ConfigureContainer()
    
        ' ViewModel からビュー名の文字列で指定できるように、事前に SubView を登録しておく
        Me.Container.RegisterTypeForNavigation(Of SubView)()
    
    End Sub
    

  •  次に、ViewModel 内で、コマンドをインスタンス生成します。 実行処理内では、ブートストラッパーで登録した SubView ユーザーコントロールを文字列指定して遷移する処理を記載します。 遷移処理は、IRegionManager インターフェースの RequestNavigate メソッドを呼び出して遷移します。 ※実行時は、IRegionManager インターフェースを継承した RegionManager クラスのインスタンスがセットされています。

  • Public Sub New()
    
        Me.ShowCommand = New DelegateCommand(AddressOf Me.ShowView)
    
    End Sub
    
    Private Sub ShowView()
    
        ' ブートストラップで登録したビュー名を指定して表示依頼する
        Me.Manager.RequestNavigate("ContentRegion", "SubView")
    
    End Sub
    

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

  •  それでは、以下ソース全体です。
  •  今回は、WPF アプリケーションプロジェクトだけです。

  •  Window1ViewModel.vb

  • Imports Prism.Regions
    Imports Prism.Unity
    Imports Prism.Commands
    Imports Microsoft.Practices.Unity
    
    Namespace ViewModels
    
        Public Class Window1ViewModel
    
            Public Property Title As String = "Prism Unity Application"
            Public Property ShowCommand As DelegateCommand
    
            <Dependency>
            Public Property Manager As IRegionManager
    
            <Dependency>
            Public Property Container As IUnityContainer
    
            ' コンストラクタ生成後に、Dependency 属性が付いたメンバーがインスタンス生成(インジェクション)される
            Public Sub New()
    
                Me.ShowCommand = New DelegateCommand(AddressOf Me.ShowView)
    
            End Sub
    
            Private Sub ShowView()
    
                ' ブートストラップで登録したビュー名を指定して表示依頼する
                Me.Manager.RequestNavigate("ContentRegion", "SubView")
    
            End Sub
    
        End Class
    
    End Namespace
    

  •  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/"
            prism:ViewModelLocator.AutoWireViewModel="True"
            xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
            mc:Ignorable="d"
            Title="{Binding Title}" Height="350" Width="525">
    
        <StackPanel>
    
            <Button Content="表示" Command="{Binding ShowCommand}" />
            <ContentControl prism:RegionManager.RegionName="ContentRegion" />
    
        </StackPanel>
        
    </Window>
    

  •  SubView.xaml
  •  画面クラスのコードビハインドには、名前空間の追加以外、処理はありません。

  • <UserControl x:Class="Views.SubView"
                 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:WpfApplication1.Views"
                 mc:Ignorable="d" 
                 d:DesignHeight="300" d:DesignWidth="300">
        
        <Grid>
    
            <TextBox Text="Hello, Prism! from UserControl" />
    
        </Grid>
        
    </UserControl>
    

  •  Bootstrapper.vb

  • Imports Microsoft.Practices.Unity
    Imports Prism.Unity
    Imports WpfApplication1.Views
    Imports Prism.Mvvm
    
    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
    
        ' Unity コンテナの設定
        Protected Overrides Sub ConfigureContainer()
            MyBase.ConfigureContainer()
    
            ' ViewModel からビュー名の文字列で指定できるように、事前に SubView を登録しておく
            Me.Container.RegisterTypeForNavigation(Of SubView)()
    
        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