zoukankan      html  css  js  c++  java
  • 信息系统开发平台OpenExpressApp - AutoUI自动生成界面

      下图为OpenExpressApp的系统架构图,其中在UI层支持WPF和ASP.NET MVC,目前首先实现了对WPF的支持。在《信息系统开发平台OpenExpressApp - 理解核心元素ObjectView》中的ObjectView的生成控件功能都是委托给AutoUI静态类库来完成的,本篇将讲解AutoUI功能。

    应用模型贯穿于整个架构层

    哪些地方调用了AutoUI静态类 

    •  

      ListObjectView中树形列表视图的TreeListEditor的CreateControl,调用了AutoUI.CreateTreeListControl生成TreeLi st控件

       public class TreeListEditor : ListEditor
        {
            public override object CreateControl()
            {
                Control 
    = AutoUI.CreateTreeListControl(BOType, View);
          ...
       }
       }
    • ListObjectView中Grid列表视图的ListEditor的CreateControl,调用了AutoUI.CreateListControl生成Grid控件

       

      public class ListEditor
        {
               public virtual object CreateControl()
            {
                Control 
    = AutoUI.CreateListControl(BOType, View);
          ...
         }
     }  

    • DetailObjectView的CreateControl调用AutoUI.CreateDetailView生成对象编辑详细面板


     public class DetailObjectView : ObjectView
       {    
            public override object CreateControl()
            {
                var control 
    = AutoUI.CreateDetailView(BOType, thistrue);
                
    return control;
            }
       }
    • NavigateQueryObjectView的CreateControl调用AutoUI.CreateDetailView生成对象导航详细面板

     public class DetailObjectView : ObjectView
       {    
            public override object CreateControl()
            {
                var control 
    = AutoUI.CreateDetailView(BOType, thistrue);
                
    return control;
            }
       }
    • 模块和View通过CreateMainToolBar、CreateChildToolBar自动生成工具条


    AutoUI静态类方法介绍

    CreateDetailView

    CreateDetailView生成详细信息视图,生成结果是一个DockPanel,分为上下两部分,上面部分是AutoGrid,用来显示详细属性编辑器控件,下面部分是子对象列表信息区域。

    详细信息区域

    通过对象标识【ShowInDetail】来判断是否需要显示该属性,如果需要显示,则通过属性编辑器来生成具体的控件,然后布局在AutoGrid中

    Code

    子对象区域

    如果有子对象,则生成一个子对象区域,现在是生成页签样式,每个子对象分别一个Tab页面,子对象又可以层级生成子对象。

    Code

    在生成子对象时,需要考虑生成子对象工具条、导航面板、布局等

    Code

    CreateListControl

    CreateListControl生成DataGrid列表控件,通过对象类属性标识为【ShowInList】或者【ShowInLookup】来动态生成列,具体列编辑和显示控件由属性对应的GridColumn来完成。

    Code

    CreateTreeListControl

    CreateTreeListControl生成树形控件。由于树形控件支持多对象显示,现在生成时是采用一种简便的算法,如果各对象的属性Name一样,则认为显示在同一列中;父对象的属性排在前面。

    Code

    CreateMainToolBar、CreateChildToolBar

    CreateMainToolBar生成根对象工具条,系统根据当前对象类型的相关设置在Command注册库中查找并自动添加

    Code

    CreateChildToolBar生成子对象工具条,这个方法一般在前面介绍的CreateDetailView方法中生成子对象区域时使用。

    具体编辑器控件生成

    AutoUI静态类方法主要是生成Grid、TreeGrid、Panel等大的控件,具体针对每个属性的编辑和显示控件是由属性编辑器、GridColumn和TreeColumn来生成的,而GridColumn和TreeColumn的具体编辑控件又是由属性编辑器来生成的,所以属性编辑器是AutoUI内部的重要部分。

    属性编辑器

    在《内置支持的属性编辑方式》讲过支持的属性编辑器类型,每种类型都对应一个编辑器类。由于每个属性编辑器都比较类似,下面简单说明一下string属性编辑器。

    每个属性编辑器都有一个方法CreateControlCore来生成编辑控件,StringPropertyEditor 生成了一个TextBox并绑定到对象属性上。还有一个方法SetControlReadOnly来控制只读时控件的状态改变。

    Code
        public class StringPropertyEditor : WPFPropertyEditor
        {
            
    private TextBox tb;

            
    public override void SetControlReadOnly()
            {
                tb.IsReadOnly 
    = ReadOnly;
            }

            
    protected override object CreateControlCore()
            {
                tb 
    = new TextBox()
                {
                    Name 
    = PropertyInfo.Name,
                };
                
    //绑定TextBox到对象属性
                Binding textBinding = new Binding(PropertyInfo.Name);
                
    //如果是只读属性,则设置binding mode
                if (!PropertyInfo.PropertyInfo.CanWrite) textBinding.Mode = BindingMode.OneWay;
                tb.SetBinding(TextBox.TextProperty, textBinding);
                
    return tb;
            }
        }

    为了重用这些属性编辑器,GridColumn和TreeColumn的列的具体编辑控件都是由属性编辑器来生成,例如StringTreeColumn内部使用了StringPropertyEditor

    Code
        public class StringTreeColumn : TreeColumn
        {
            
    private StringPropertyEditor _editor;

            
    public StringTreeColumn(BusinessObjectPropertyInfo info, ListObjectView view)
                : 
    base(info, view)
            {
                
    this._editor = new StringPropertyEditor();
            }

            
    public override PropertyEditor Editor
            {
                
    get
                {
                    
    return this._editor;
                }
            }
        }

    自定义对象编辑界面

    前面讲的生成控件都是按照对象标识以及对象属性标识,以及相关的命令设置来生成。实际开发中,可能存在一些业务对象需要其他界面样式来显示(如使用报表控件ReportView来显示列表信息),而AutoUI是处理共性要求的界面表现,这时我们框架就需要提供一种扩展机制,允许用户自定义编辑界面来对应到业务对象。AutoUI生成各类UI时先判断业务对象该类型下的UI有没有自定义,如果有则直接生成对应的Type指定的UserControl,否则按照上面的AutoUI自定生成。

    Code
        /// <summary>
        
    /// 业务对象模型
        
    /// </summary>
        public class BusinessObjectInfo
        {
            
    /// <summary>
            
    /// AutoUI不满足应用需要时,通过挂接此属性来自定义明细UI
            
    /// </summary>
            public Type ModuleUIType { getprivate set; }
            
    public Type ListViewUIType { getprivate set; }
            
    public Type DetailViewUIType { getprivate set; }
            
        }

    信息系统开发平台OpenExpressApp - 理解核心元素ObjectView


    更多内容: 开源信息系统开发平台之OpenExpressApp框架.pdf


    欢迎转载,转载请注明:转载自周金根 [ http://zhoujg.cnblogs.com/ ]

  • 相关阅读:
    <li>标签在ie6下的上下间隔的BUG解决办法
    win7 瘦身 减肥 记录!
    学习系统封装半年经验总结!
    DIV 类似 hover 悬停效果 鼠标移动上去变化
    解决 WIN7 部署 安装驱动包时出现的驱动签名提示 办法!
    Windows 7 瘦身大全 系统减肥 轻松 瘦身 减肥 3个G
    JS 判断 取 当前系统类型 可用来定义某些WIN7系统和XP系统下字体区别
    JS 判断 当前浏览器类型
    EasyBoot常用的命令
    Win7封装保持任务栏锁定项不变的解决方法
  • 原文地址:https://www.cnblogs.com/zhoujg/p/1600687.html
Copyright © 2011-2022 走看看