• 从Prism中学习设计模式之Adapter模式


    Prism是一款轻量级的WPF框架,用于建立复合的WPF应用程序,尽可能的将Ui和逻辑分开。在对这款框架的理解过程也是一个对设计模式的理解过程。

    Prism Link:http://compositewpf.codeplex.com/

                      图1

    如图1,是Prism的架构图,从中我们可以看到使用了多种设计模式,本文对Shell和Region中使用的Adapter模式进行扩展。

    Adapter模式的讲解:

    Link: http://www.cnblogs.com/cjfwu/archive/2013/03/23/2977878.html

    上文详细描述了Adapter模式的定义、实现。

    在Prism中Bootstrapper主引导类中在ConfigureRegionAdapterMappings虚方法中实现了以下控件的注册,提供相关类的适配转换:

    • ContentControl
    • TabControl(Sliverlight)
    • Seletor
    • ItemControl

    在Shell中实现控件的适配。代码如下:

    ConfigureRegionAdapterMappings
            protected virtual RegionAdapterMappings ConfigureRegionAdapterMappings()
            {
                RegionAdapterMappings regionAdapterMappings = ServiceLocator.Current.GetInstance<RegionAdapterMappings>();
                if (regionAdapterMappings != null)
                {
    #if SILVERLIGHT
                    regionAdapterMappings.RegisterMapping(typeof(TabControl), ServiceLocator.Current.GetInstance<TabControlRegionAdapter>());
    #endif
                    regionAdapterMappings.RegisterMapping(typeof(Selector), ServiceLocator.Current.GetInstance<SelectorRegionAdapter>());
                    regionAdapterMappings.RegisterMapping(typeof(ItemsControl), ServiceLocator.Current.GetInstance<ItemsControlRegionAdapter>());
                    regionAdapterMappings.RegisterMapping(typeof(ContentControl), ServiceLocator.Current.GetInstance<ContentControlRegionAdapter>());
                }
    
                return regionAdapterMappings;
            }

    以上我们知道了来龙去脉,这样我们可以通过复写改方法实现功能的扩展。

    如我们需要增加ListBox,实现如下:

    1.继承IRegionAdapter接口

    public class ListBoxRegionAdapter : IRegionAdapter
    {
        public IRegion Initialize(object regionTarget, string regionName)
        {
            ListBox listbox= regionTarget as ListBox;        
            return new Region();
        }
    }

    2.重写Bootstrapper的ConfigureRegionAdapterMappings方法,注册映射关系

    1 protected override RegionAdapterMappings ConfigureRegionAdapterMappings()
    2 {
    3     RegionAdapterMappings regionAdapterMappings = base.ConfigureRegionAdapterMappings();
    4     regionAdapterMappings.RegisterMapping(typeof(ListBox), this.Container.Resolve<ListBoxRegionAdapter>());
    5     return regionAdapterMappings;
    6 }

    这样就完成了适配的扩展。

  • 相关阅读:
    错误 6 未能找到类型或命名空间名称“BLL”(是否缺少 using 指令或程序集引用?)
    linq 两个字段排序
    设置checkbox只读
    乐蜂网SALES倒计时原码展示
    Value cannot be null. Parameter name: source
    浅谈windows.onload()与$(document).ready()
    MVC之ViewData.Model
    td标签里内容不换行
    input type="image" 提交表单
    扩展Puppet – 建立Puppet CA集群
  • 原文地址:https://www.cnblogs.com/tmywu/p/3033174.html
Copyright © 2020-2023  润新知