Mahapps & Prism 汉堡菜单

Mahapps & Prism HamburgerMenu

我目前正在使用 Prism 和 Mahapps 构建 WPF 应用程序。

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

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

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

此致

我就是这样处理的。

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));
}