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));
}
我目前正在使用 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));
}