2017-07-17 47 views
0

私は現在、PrismとMahappsでWPF-Appを構築しています。Mahapps&Prism HamburgerMenu

私は問題に遭遇し、HriserMenu with Prismを実装しました。 地域経由でハンバーガーメニューを記入する方法はありますか?

例として、添付されたプロパティRegionManager.RegionNameを介してRegionControlsから派生したコントロールを使用すると、ItemsControlsに登録されたビューがこの領域に自動的に埋められます。

HamurgerMenuのこの動作を模倣する方法はありますか?

よろしくお願いします。

答えて

1

これは私がそれを管理した方法です。

1)メニューアイテムコレクションの領域に名前を付けます。

<controls:HamburgerMenu.ItemsSource> 
      <controls:HamburgerMenuItemCollection prism:RegionManager.RegionName="MenuRegion"/> 
</controls:HamburgerMenu.ItemsSource> 

2)HamburgerMenuItemCollection

public class HamburgerMenuItemCollectionRegionAdapter : RegionAdapterBase<HamburgerMenuItemCollection> 

{ 
    public HamburgerMenuItemCollectionRegionAdapter(IRegionBehaviorFactory regionBehaviorFactory) 
     : base(regionBehaviorFactory) 
    { 
    } 

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

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

3)ブートストラップでアダプタを登録するための領域のアダプタを定義します。

protected override RegionAdapterMappings ConfigureRegionAdapterMappings() 
{ 
    RegionAdapterMappings mappings = base.ConfigureRegionAdapterMappings(); 
    mappings.RegisterMapping(typeof(HamburgerMenuItemCollection), Container.Resolve<HamburgerMenuItemCollectionRegionAdapter>()); 
    return mappings; 
} 

4)プリズムモジュール

public partial class OptionOneMenuItem : HamburgerMenuGlyphItem 
{ 
    public OptionOneMenuItem() 
    { 
     Glyph = "/Assets/OptionOne.png"; 
     Label = "Option One"; 
     Command = ApplicationCommands.NavigateCommand; 
     CommandParameter = typeof(OptionOnePageView); 

     InitializeComponent(); 
    } 
} 

5)最後に、モジュールinitialsationのメニュー項目をレジスタにメニュー項目を定義します。回答のため

protected override void InitializeModule() 
{ 
    RegionManager.RegisterViewWithRegion("MenuRegion", typeof(MyOptionOneMenuItem)); 
    RegionManager.RegisterViewWithRegion("MenuRegion", typeof(MyOptionTwoMenuItem)); 
} 
+0

おかげで、 は、私はすでに(あなたの提案に似て)自分で解決策を見つけた:) – Malte

+0

私は、このソリューションを試してみましたが、私は、無効なキャスト例外を取得しています。 また、メソッドが基本クラスに存在しないため、継承されたクラスコンストラクタからInitializeComponentを呼び出す方法はありません。 –

+0

コードを投稿できますか?私はあなたがInitializeComponentをなぜ呼び出す必要があるのか​​よく分かりません。これと例外の場所を表示できますか? –

関連する問題