LoginSignup
0
1

More than 3 years have passed since last update.

Prism コードサンプル学習:03-CustomRegions

Posted at

Prism コードサンプル学習:03-CustomRegions

はじめに

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

03-CustomRegions

本サンプルではRegionAdapterBaseクラスを用いて、既存のコントロールに領域の名称を与えるサンプルのようです。

<Window x:Class="Regions.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">
    <Grid>
        <StackPanel prism:RegionManager.RegionName="ContentRegion" />
    </Grid>
</Window>
    public class StackPanelRegionAdapter : RegionAdapterBase<StackPanel>
    {
        public StackPanelRegionAdapter(IRegionBehaviorFactory regionBehaviorFactory)
            : base(regionBehaviorFactory)
        {

        }

        protected override void Adapt(IRegion region, StackPanel regionTarget)
        {
            region.Views.CollectionChanged += (s, e) =>
            {
                if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Add)
                {
                    foreach (FrameworkElement element in e.NewItems)
                    {
                        regionTarget.Children.Add(element);
                    }
                }

                //handle remove
            };
        }

        protected override IRegion CreateRegion()
        {
            return new AllActiveRegion();
        }
    }

    /// <summary>
    /// Interaction logic for App.xaml
    /// </summary>
    public partial class App : PrismApplication
    {
        ... (省略) ...

        protected override void ConfigureRegionAdapterMappings(RegionAdapterMappings regionAdapterMappings)
        {
            base.ConfigureRegionAdapterMappings(regionAdapterMappings);
            regionAdapterMappings.RegisterMapping(typeof(StackPanel), Container.Resolve<StackPanelRegionAdapter>());
        }
    }
  • ConfigureRegionAdapterMappingsメソッドで、領域のマッピングが登録される
    • ConfigureRegionAdapterMappingsメソッドはBootstrap.Runメソッド内で呼び出される
  • RegionAdapterBase<T>クラスはこちら
    • AdaptメソッドはInitializeメソッドの中で呼び出される
    • AdaptメソッドでViewに追加された子要素に対して、追加・削除時の処理を実装できそう
    • IRegionAdapter.Initializeメソッドの中でこのクラスで実装されているInitializeメソッドで呼び出される。
    • 上記のインターフェース+メソッド名で定義されるのは明示的なインターフェースの実装
    • CreateRegionメソッドも同様にInitialilzeメソッドの中で呼び出される。
    • AllActiveRegionクラスはこちら
    • Regionはアクティブである状態と非アクティブである状態を持つ
      • プロパティの意味が定義先を見ても分からなかった。ただ、字面から推測する限り、アクティブなRegionであるか状態を管理することで、パフォーマンスを向上させられたりできる?と思われる。

おわりに

今回はRegionAdapterBaseクラスのソースコードを中心に読みました。
一部現段階ではわからない実装もあるため、それを明らかにできるように引き続き読んでいきます。
次回、04-ViewDiscoveryについて見ていこうと思います。

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