0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Prism コードサンプル学習:06-ViewActivationDeactivation

Posted at

Prism コードサンプル学習:06-ViewActivationDeactivation

はじめに

以下の記事の続きです。
https://qiita.com/mngreen/items/2d1d3243f1514eccebcf

06-ViewActivationDeactivation

本サンプルではRegionクラスを用いて、対象regionのViewをActivate、またはDeactivateすることで表示・非表示が切り替えています。

<Window x:Class="ActivationDeactivation.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/"
        Title="Shell" Height="350" Width="525">
    <DockPanel LastChildFill="True">
        <StackPanel>
            <Button Content="Activate ViewA" Click="Button_Click"/>
            <Button Content="Deactivate ViewA" Click="Button_Click_1"/>
            <Button Content="Activate ViewB" Click="Button_Click_2"/>
            <Button Content="Deactivate ViewB" Click="Button_Click_3"/>
        </StackPanel>
        <ContentControl prism:RegionManager.RegionName="ContentRegion" HorizontalAlignment="Center" VerticalAlignment="Center" />
    </DockPanel>
</Window>
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        IContainerExtension _container;
        IRegionManager _regionManager;
        IRegion _region;

        ViewA _viewA;
        ViewB _viewB;

        public MainWindow(IContainerExtension container, IRegionManager regionManager)
        {
            InitializeComponent();
            _container = container;
            _regionManager = regionManager;

            this.Loaded += MainWindow_Loaded;
        }

        private void MainWindow_Loaded(object sender, RoutedEventArgs e)
        {
            _viewA = _container.Resolve<ViewA>();
            _viewB = _container.Resolve<ViewB>();

            _region = _regionManager.Regions["ContentRegion"];

            _region.Add(_viewA);
            _region.Add(_viewB);
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            //activate view a
            _region.Activate(_viewA);
        }

        private void Button_Click_1(object sender, RoutedEventArgs e)
        {
            //deactivate view a
            _region.Deactivate(_viewA);
        }

        private void Button_Click_2(object sender, RoutedEventArgs e)
        {
            //activate view b
            _region.Activate(_viewB);
        }

        private void Button_Click_3(object sender, RoutedEventArgs e)
        {
            //deactivate view b
            _region.Deactivate(_viewB);
        }
    }
  • [Activate ViewA], [Activate ViewB]ボタンを押下することで、ContentRegionにViewが表示されます。
  • [Deactivate ViewA], [Deactivate ViewB]ボタンを押下することで、ContentRegionのViewが非表示になります。
  • ただし、複数がアクティブになることはありません。
    • ViewAをアクティブ→ViewBをアクティブ→ViewBを非アクティブにしても、ViewAはアクティブとはならない。
  • Activateメソッドが呼び出されると引数に渡されたビューのItemMetadataを取得し、そのIsActiveプロパティをtrueにする。
  • Deactivateメソッドが呼び出されると引数に渡されたビューのItemMetadataを取得し、そのIsActiveプロパティをfalseにする。
  • ContentControlRegionAdapterクラスに着目。
    • ContentControlRegionではRegionを生成する際に、Activeとなるビューが一つとなるSingleActiveRegionを生成する。このクラスでは他のクラスがアクティブになると、現在アクティブなビューは非アクティブになってしまう。そのため複数のViewがアクティブにならない。

おわりに

今回はRegionクラス, ContentControlRegionAdapterクラス, SingleActiveRegionクラスのソースコードを中心に読みました。
以前の章で紹介されたように、XXXRegionAdapterクラスを利用することで、Active時のUIをコントロールすることができるといった事例として学ぶことができました。
次回、07-Modulesについて見ていこうと思います。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?