信息系统开发平台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/ ]

posted on 2009-11-11 11:49 周 金根 阅读(...) 评论(...) 编辑 收藏

导航