シンプルなRegionManager

多くの人がPrismライブラリを知っていますが、多くの場合、その広範な機能はすべて不要です。 時には、このライブラリのいくつかの便利な機能を使用したいことがあります。

そのような小さなコードを切り離すことはできません。その場合、おおよその機能を備えた独自の実装を作成する必要があります。

RegionManagerは興味深い利点の1つであり、その単純な実装を検討します



すぐに、次のコードを使用してコード例を示します



xaml-領域の宣言

<Grid x:Name="LayoutRoot" xmlns:service="clr-namespace:TestProgramm.Services"> <DockPanel LastChildFill="True"> <ContentControl DockPanel.Dock="Top" service:RegionManager.Region="TopPanel"/> <ContentControl DockPanel.Dock="Left" service:RegionManager.Region="LeftPanel"/> <ContentControl service:RegionManager.Region="Center"/> </DockPanel> </Grid>
      
      





コード -中央領域を埋める

 SimpleIoc.Default.GetInstance<RegionManager>().Set("Center",SimpleIoc.Default.GetInstance<HomeView>());
      
      







ここおよび実装自体では、 MVVM Light Toolkitを使用しますが、それは少数であり、重要ではなく、注意をそらすことはありません。




RegionManagerクラスの実際の実装:



 public class RegionManager { #region  private Dictionary <String, DependencyObject> Regions = new Dictionary<string , DependencyObject>(); #endregion /// <summary> ///   /// </summary> /// <param name="sender">    </param> /// <param name="name"> </param> public void Unregister(DependencyObject sender, string name) { if (Regions.Contains(new KeyValuePair<String, DependencyObject>(name, sender))) Regions.Remove(name); } /// <summary> ///   /// </summary> /// <param name="sender">    </param> /// <param name="name"> </param> public void Register(DependencyObject sender, string name) { if (sender.GetType().GetProperty( "Content" ) == null ) throw new ArgumentException(); Regions[name] = sender; } /// <summary> ///   /// </summary> /// <param name="name"> </param> /// <param name="element">,    </param> public void Set(String name, object element) { if (Regions.ContainsKey(name)) Regions[name].SetValue( ContentControl.ContentProperty, element); } #region  Region public static String GetRegion( DependencyObject obj) { return (String )obj.GetValue(RegionProperty); } public static void SetRegion( DependencyObject obj, String value) { obj.SetValue(RegionProperty, value); } public static readonly DependencyProperty RegionProperty = DependencyProperty.RegisterAttached("Region" , typeof( String), typeof(RegionManager ), new UIPropertyMetadata(PropertyChanged)); public static void PropertyChanged( DependencyObject sender, DependencyPropertyChangedEventArgs e) { if (e.OldValue != null ) ServiceLocator.Current.GetInstance<RegionManager >().Unregister(sender, e.OldValue as String ); if (e.NewValue != null ) ServiceLocator.Current.GetInstance<RegionManager >().Register(sender, e.NewValue as String); } #endregion }
      
      







準備ができて。



All Articles