Mahapps& Prism HamburgerMenu

时间:2017-07-17 21:55:06

标签: c# wpf prism mahapps.metro

我目前正在使用Prism和Mahapps构建一个WPF-App。

在使用Prism实现HamburgerMenu时遇到了问题。 有没有办法通过该区域填充HamburgerMenu?

例如,当我使用从ItemsControls派生的控件并附加了一个区域(通过附加属性RegionManager.RegionName)时,它会自动将任何已注册的视图填充到ItemsControls中。

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

此致

1 个答案:

答案 0 :(得分:2)

这就是我管理它的方式。

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)在Prism模块中定义菜单项

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

        InitializeComponent();
    }
}

5)最后在模块初始化中注册菜单项。

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