• prism 中的 自定义region


    参考网址: https://blog.csdn.net/weixin_30872499/article/details/98673059

    并不是所有控件都可以被用作Region了吗?我们将Gird块的代码变成这样:

        <Grid>

            <ContentControl prism:RegionManager.RegionName="ContentRegion" />

            <StackPanel prism:RegionManager.RegionName="ContentRegion2" />

        </Grid>

    似乎看上去一切正常,让我们来启动他。

    Oops!!!程序并没有按照我们想象的那样启动,而是抛给了我们一个异常:

    Prism.Regions.UpdateRegionsException: 'An exception occurred while trying to create region objects.

    Prism在生成一个Region对象的时候报错了,看上去,StackPanel并不支持用作Region。那么有其他的方法让他可以被用作Region吗?因为我们很喜欢用StackPanel( ﹁ ﹁ ) ~→(不要管我为什么喜欢,你不,我就偏要) 这难不倒Prism,毕竟创建Region对象就是他自己的事情,做分内的事应该没问题的。

    你需要为一个将被用作Region的添加RegionAdapter(适配器)。RegionAdapter的作用是为特定的控件创建相应的Region,并将控件与Region进行绑定,然后为Region添加一些行为。一个RegionAdapter需要实现IRegionAdapte接口,如果你需要自定义一个RegionAdapter,可以通过继承RegionAdapterBase类来省去一些工作。

    那,为什么ContentControl就可以呢?因为:

    The Composite Application Library provides three region adapters out-of-the-box:

    ContentControlRegionAdapter. This adapter adapts controls of type System.Windows.Controls.ContentControl and derived classes.

    SelectorRegionAdapter. This adapter adapts controls derived from the class System.Windows.Controls.Primitives.Selector, such as the System.Windows.Controls.TabControl control.

    ItemsControlRegionAdapter. This adapter adapts controls of type System.Windows.Controls.ItemsControl and derived classes.

    因为这三个是内定的(蛤蛤),就是已经帮你实现了RegionAdapter。接下来,我们看看怎么为StackPanel实现RegionAdapter

    step1 新建一个类StackPanelRegionAdapter.cs,继承RegionAdapterBase ,这个类已经帮我们实现了IRegionAdapte接口。

    using Prism.Regions;

    using System.Windows;

    using System.Windows.Controls;

    namespace Regions.Prism

    {

        public class StackPanelRegionAdapter : RegionAdapterBase<StackPanel>

        {

            public StackPanelRegionAdapter(IRegionBehaviorFactory regionBehaviorFactory)

                : base(regionBehaviorFactory)

            {

            }

            protected override void Adapt(IRegion region, StackPanel regionTarget)

            {

                region.Views.CollectionChanged += (s, e) =>

                {

                    if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Add)

                    {

                        foreach (FrameworkElement element in e.NewItems)

                        {

                            regionTarget.Children.Add(element);

                        }

                    }

                    //handle remove

                };

            }

            protected override IRegion CreateRegion()

            {

                return new AllActiveRegion();

            }

        }

    }

    setp2 App.xaml.cs注册绑定

            protected override void ConfigureRegionAdapterMappings(RegionAdapterMappings regionAdapterMappings)

            {

                base.ConfigureRegionAdapterMappings(regionAdapterMappings);

                regionAdapterMappings.RegisterMapping(typeof(StackPanel), Container.Resolve<StackPanelRegionAdapter>());

            }

    我们现在可以为StackPanel实现用作Region了。我们再运行刚才抛给我们异常的程序,是不是已经跑起来了呢?

  • 相关阅读:
    css3:让IE兼容background-size的方法
    判断浏览器版本是否是ie9以下浏览器,提示升级
    正则表达式
    H5页面内容较少时如何让页面全屏在手机显示呢
    页面滚动指定高度时添加样式或动画
    使用js实现导航切换效果变化(收集案例)
    单行文字定时滚动(收集案例)
    使用zepto.js完成的手机相册
    Repaint 、Reflow 的基本认识和优化
    Web-[强网杯 2019]随便注
  • 原文地址:https://www.cnblogs.com/bruce1992/p/14765004.html
Copyright © 2020-2023  润新知