0

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

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

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

只是将IsOpen属性设置为 false 然后打开是行不通的:(

4

1 回答 1

2

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

  1. 首先,在 上定义区域名称FlyoutRegionFlyoutsControl

    <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));
    

这里的技巧是在 ViewModel 中公开HeaderIsOpenPosition属性并将其与FlyoutView相关联。

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

于 2015-10-25T11:30:15.587 回答