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

时间:2015-05-27 05:50:04

标签: c# wpf prism mahapps.metro flyout

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

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

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

只需将IsOpen属性设置为false然后再打开就不起作用了:(

1 个答案:

答案 0 :(得分:2)

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

  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 注册所需的视图。

    regionManager.RegisterViewWithRegion("FlyoutRegion", typeof(FlyoutView));
    
  4. 这里的技巧是在ViewModel中公开标题 IsOpen 位置属性,并将其与 FlyoutView

    您可以参考此Code Project Link

    的详细信息