我目前正在使用Prism和Mahapps构建一个WPF-App。
在使用Prism实现HamburgerMenu时遇到了问题。 有没有办法通过该区域填充HamburgerMenu?
例如,当我使用从ItemsControls派生的控件并附加了一个区域(通过附加属性RegionManager.RegionName)时,它会自动将任何已注册的视图填充到ItemsControls中。
有没有办法模仿HamurgerMenu的这种行为?
此致
答案 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));
}