在我的应用中,我正在使用Prism
和MahApps.metro
。我为RegionAdapter
创建了一个FlyoutsControl
,这就像一个魅力。
唯一的问题是,当我第一次将视图导入Flyout Region,
时,会弹出Flyout
而不是从侧面滑入。
我可以想象这是因为它是在运行时创建的并在运行时添加到FlyoutsControl
,但有可能创建Flyout
,将其添加到FlyoutsControl
和然后通过Slide-In效果显示它?
只需将IsOpen
属性设置为false然后再打开就不起作用了:(
答案 0 :(得分:2)
我试图做同样的事情并遇到问题,但后来我找到了解决方案。
首先,在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 注册所需的视图。
regionManager.RegisterViewWithRegion("FlyoutRegion", typeof(FlyoutView));
这里的技巧是在ViewModel中公开标题, IsOpen 和位置属性,并将其与 FlyoutView
您可以参考此Code Project Link
的详细信息