Flyout RegionAdapter第一次没有使用幻灯片效果

本文关键字:幻灯片 RegionAdapter 第一次 Flyout | 更新日期: 2023-09-27 17:50:57

在我的应用程序中,我使用PrismMahApps.metro。我为FlyoutsControl创建了一个RegionAdapter,这就像一个魅力。

唯一的问题是,当我第一次将视图导航到Flyout Region,时,Flyout会弹出,而不是从侧面滑动。

我可以想象这是因为它是在运行时创建的,并在运行时添加到FlyoutsControl,但是是否有可能创建Flyout,将其添加到FlyoutsControl,然后通过滑动显示效果显示它?

仅仅将IsOpen属性设置为false然后打开不起作用:(

Flyout RegionAdapter第一次没有使用幻灯片效果

我正试图做同样的事情,并有问题,但后来我找到了解决方案。

  1. 首先,在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>
    
  2. 创建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;
    }
    
  3. 最后,用FlyoutRegion注册所需的View。

    regionManager.RegisterViewWithRegion("FlyoutRegion", typeof(FlyoutView));
    
这里的技巧是在ViewModel中公开HeaderIsOpenPosition属性,并将其与FlyoutView关联。

您可以参考此代码项目链接的详细信息