在我的应用程序中,我使用Prism
和MahApps.metro
。我为FlyoutsControl
创建了一个RegionAdapter
,这就像一个魅力。
唯一的问题是,当我第一次将视图导航到Flyout Region,
时,Flyout
会弹出,而不是从侧面滑动。
我可以想象这是因为它是在运行时创建的,并在运行时添加到FlyoutsControl
,但是是否有可能创建Flyout
,将其添加到FlyoutsControl
,然后通过滑动显示效果显示它?
仅仅将IsOpen
属性设置为false然后打开不起作用:(
我正试图做同样的事情,并有问题,但后来我找到了解决方案。
-
首先,在
FlyoutsControl
上定义区域名称FlyoutRegion<mahApps:MetroWindow ...> <mahApps:MetroWindow.Flyouts> <mahApps:FlyoutsControl prism:RegionManager.RegionName="FlyoutRegion"> <mahApps:FlyoutsControl.ItemContainerStyle> <Style TargetType="{x:Type mahApps:Flyout}"> <Setter Property="Header" Value="{Binding Header}" /> <Setter Property="IsOpen" Value="{Binding IsOpen}" /> <Setter Property="Position" Value="{Binding Position}" /> </Style> </mahApps:FlyoutsControl.ItemContainerStyle> </mahApps:FlyoutsControl> </mahApps:MetroWindow.Flyouts> </mahApps:MetroWindow>
-
创建RegionAdapter并在Bootstrapper中注册。
[Export] public class FlyoutsControlRegionAdapter : RegionAdapterBase<FlyoutsControl> { [ImportingConstructor] public FlyoutsControlRegionAdapter(IRegionBehaviorFactory factory) : base(factory) { } protected override void Adapt(IRegion region, FlyoutsControl regionTarget) { region.ActiveViews.CollectionChanged += (s, e) => { if (e.Action == NotifyCollectionChangedAction.Add) { foreach (FrameworkElement element in e.NewItems) { Flyout flyout = new Flyout(); flyout.Content = element; flyout.DataContext = element.DataContext; regionTarget.Items.Add(flyout); } } }; } protected override IRegion CreateRegion() { return new AllActiveRegion(); } }
内部启动加载器
protected override RegionAdapterMappings ConfigureRegionAdapterMappings() { var mappings = base.ConfigureRegionAdapterMappings(); mappings.RegisterMapping(typeof(FlyoutsControl), Container.GetExportedValue<FlyoutsControlRegionAdapter>()); return mappings; }
-
最后,用FlyoutRegion注册所需的View。
regionManager.RegisterViewWithRegion("FlyoutRegion", typeof(FlyoutView));
您可以参考此代码项目链接的详细信息