WPF PRISM – Regions

לאחר שהכרנו את הספריה של Prism ולמדנו כיצד להפעיל את האפליקציה שלנו
באמצעותה. נמשיך בפוסט זה ללמוד Regions ולמה הם משמשים אותנו וכיצד נוכל לנהל אותם.

מה זה Region?

ה Region משמש ב Prism כ Placehoder עבור תוכן דינמי ש"נזיק" עבורם
כלומר, ה Shell שהוא כפי שאנחנו יודעים הוא המיכל של האפליקציה והוא
לצורך הצגת תוכן יכיל Region אחד או יותר.
כל Region מקבל View עבורו.
על מנת לשמור על מדולריות ה Region אינו מכיר את View והוא אינו תלוי בו.
את יצירת ה Region ניתן לעשות או בקוד או באמצעות ה XAML.
חשוב לציין, Region לא חייב להיות ישירות על ה Shell
הוא יכול להיות מקושר ל View.
בנוסף, Region יורש מ IRegion

Region Manager

כפי שציינו תפקידו של Region Manager הוא לנהל את Regions במערכת שלנו,
והוא עושה את זה באמצעות שמירה של רשימה של ה Regions.
על ידי attached property בשם RegionName שבו יש לתת שם ל Region שם,
ובכך באמצעות השם של ה Region – ה Region Manager יכול לספק מידע
לאותו Region.

RegionAdapter – ה RegionAdapter אחראי לקשר בין ה Region
לפקדים ה UI, מה שנקרא Maping.

Prism מספק מספק לנו 4 RegionAdapter ב"חינם":
ContentControlRegionAdapter
ItemsControlRegionAdapter
SelectRegionAdapter
TabControlRegionAdapter (רק עבור Silverlight – לא רלוונטי החל מ Prism 5).
במידה ואף אחד מ RegionAdapter שלעיל אינו מתאים לנו
נוכל ליצור אחד כזה בעצמנו.

RegionContext – דומה ברעיון שלו ל DataContext שאנחנו מכירים ב xaml
כך זה מאפשר לנו לחלחל את data לתוך ה "visual tree", כלומר – ה RegionContext זוהי בעצם
טכניקה שמאפשרת לנו להעביר מידע בין קונטרול אב לבין קונטרול בן. וכמו תמיד את RegionContext
ניתן לבצע או לידי קוד או בתוך ה xaml.

דוגמה:

זאת דוגמת המשך לדוגמה שנעשה בפוסט על Bootstrapper & Shell

ניצור 2 Regios:

  1. Menu Region
  2. Person Region

בשלב הראשון שתהיה לנו אפשרות לשלוף את שמות ה Region במקום באפליקציה, לשם כך ניצור את RegionNames.cs בתוך תיקייה בשם Infrastructure:

public class RegionNames
{
      public static string MenuRegion = "MenuRegion";
      public  static string PresonRegion = "PersonRegion";
}

בשלב הבא ניצור את Regions ב Shell, לצורך כך נכתוב ב xaml של ה Shell:

<Window x:Class="PrismDemo.Shell"
 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 xmlns:prism="http://www.codeplex.com/prism"
 xmlns:inf="clr-namespace:PrismDemo.Infrastructure"
 Title="Shell" Height="300" Width="300">
<DockPanel LastChildFill="True">
<ContentControl DockPanel.Dock="Top" prism:RegionManager.RegionName="{ x:Static inf:RegionNames.MenuRegion}"/>
<ContentControl DockPanel.Dock="Bottom" prism:RegionManager.RegionName="{x:Static inf:RegionNames.PresonRegion}"/>
       </DockPanel>
</Window>

אנו רואים שיצרנו 2 ContentControl שיחזיקו את Region שלנו ולכל Region נתנו שם שיצרנו RegionNames.cs.

בשלב הבא נרצה שה Region יציג מידע, לצורך כך אנחנו צריכים View וכל View שייך ל Module מסויים, בשלב זה לא נדון נרחיב על View & Module אך לצורך הדוגמה ניצור תיקייה חדשה בשם MenuModule, ולתוכה ניצור UserControl חדש בשם MenuView וניצור שם כפתור בודד.

לאחר מכן, ניצור באותה תיקייה את Class חדש ב MenuModule.cs שיראה כך:

public class MenuModule : IModule
{
    private IUnityContainer _container;
    private IRegionManager _regionManager;
 
    public MenuModule(IUnityContainer container, IRegionManager regionManager)
    {
        _container = container;
        _regionManager = regionManager;
    }
 
    public void Initialize()
    {
        IRegion region = _regionManager.Regions[RegionNames.MenuRegion];
        region.Add(_container.Resolve<MenuView>());
        _regionManager.RegisterViewWithRegion(RegionNames.MenuRegion, typeof(MenuView));
    }
}

זהו אם נריץ את האפליקציה נראה את הכפתור שלנו.

מצורף לינק מלא לדוגמה שלעיל

עם התגית:
פורסם ב-prism, region, Shell, Unity, wpf
תגובה אחת ב“WPF PRISM – Regions
  1. דניאל הגיב:

    פוסט מצוין! הכי טוב שיש על הנושא הזה בעברית.

    אהבתי

כתיבת תגובה