2017-07-17 144 views
0

我目前正在用Prism和Mahapps构建一个WPF应用程序。Mahapps&Prism HamburgerMenu

我在用Prism实现HamburgerMenu时遇到了问题。 有没有办法通过该地区填补汉堡包菜单?作为一个例子,当我使用从ItemsControls派生的控件(通过附加属性RegionManager.RegionName),它会自动将任何已注册的视图填充到ItemsControls中的这个区域。

有没有办法模仿HamurgerMenu的这种行为?

Regards

回答

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。你能证明这一点和例外地点吗? –