XAF新手入门 - 视图布局示例
前言
掌握了应用程序模型(ApplicationModel)的基础知识之后,通过一个视图布局示例来加强对应用程序模型的理解。
官网给出了比较丰富的示例,并且这些示例涵盖了应用程序模型操作的方方面面,通过这些示例你能全面的了解应用程序模型在XAF中的作用,建议大家要跟着官方示例操作一遍。
概述
视图布局应该是XAF中一个比较灵活的功能,XAF可以收集BO中定义的布局、模块的模型差异布局、用户的模型差异布局,生成最终的布局,也就是说开发人员可以定义XAF项目的初始布局,管理员可以定义统一的布局,用户可以定义个性布局,这些布局都可以通过模型编辑器(ModelEditor)来完成。对于开发人员来说在BO中定义布局算是一个比较友好的方式,XAF中也提供了与布局相关的Attribute,IndexAttribute可以控制视图项(ViewItem)在视图中的顺序,DetailViewLayoutAttribute可以对详情视图中的视图项进行分组,与模型编辑器中的布局相比,通过Attribute进行布局明显弱了许多。下面我们通过应用程序模型中的知识,实现另一种在BO中定义布局的方式。
设计思路
XML在布局中的应用还是比较广泛的,比如:WEB的HTML,WPF的XAML等,XML不仅对数据描述的能力比较强,同时层次结构也非常清晰,在本示例中我们将采用XML对我们的视图布局进行定义。下面是视图布局定义的示例代码:

上面的XML元素(Element)都对应着XAF视图布局(IModelViewLayout)中的节点
- v 对应的节点为IModelLayoutGroup,属性Direction为Vertical
- h 对应的节点为IModelLayoutGroup,属性Direction为Horizontal
- t 对应的节点为IModelTabbedGroup
- p 对应的节点为IModelLayoutViewItem
知道了节点的对应关系后,再看上面的示例代码,视图的布局结构是不是也能看出来了,如果你对这些节点不熟悉,你可以通过模型编辑器来查看这些节点的属性及呈现出来的效果。
有了视图布局的XML定义,我们可以通过ModelNodesGeneratorUpdater<ModelDetailViewLayoutNodesGenerator>对详情视图布局中的节点进行重新定义,思路就是解析XML,并将XML中的元素生成对应的节点,如果有子元素的,再遍历子元素,这里用到了递归。
模块项目结构

模块结构也比较简单,所有的逻辑代码都在DetailViewLayoutNodesGeneratorUpdater类中,DetailViewLayoutBuilderAttribute用于是否启用XML自定义布局,在BO上添加这个Attribute后,还要在BO中定义一个静态的BuildLayout方法,用于返回XML布局定义字符串。
写在最后
这里只给出了思路,没有对代码进行解读,因为代码也比较简单,同时也只有一个详细视图布局,大家可以参考代码,自己开发一个列表视图布局。
示例项目代码地址:https://gitee.com/easyxaf/view-layout-builder
XAF新手入门 - 视图布局示例的更多相关文章
- XAF新手入门 - 前言
很多小伙伴在第一次接触XAF时,会被它的丰富功能及开箱即用的特点所吸引,即使在不了解XAF的情况下,也能够依葫芦画瓢创建一个功能丰富的应用,但当应用到实际项目中时,你会发现与之前的愿景差距很大,很多都 ...
- XAF新手入门 - 类型子系统(Types Info Subsystem)
类型子系统概述 类型子系统是XAF的核心概念,但我们平时却很少关注它,它集中存储了模块中的类型,它是生成应用程序模型(Application Model)的基础,它与XAF中其它的概念都有所关联,了解 ...
- XAF新手入门 - 模块(Module)
模块概述 谈到模块大家应该都不会感到陌生,不管是前端还是后端都有模块的概念,XAF中的模块概念与大多数框架中的模块概念是相通的.XAF模块首先是一个.NET类库,同时它还包含一个继承自ModuleBa ...
- ASP.NET Core 入门教程 6、ASP.NET Core MVC 视图布局入门
一.前言 1.本教程主要内容 ASP.NET Core MVC (Razor)视图母版页教程 ASP.NET Core MVC (Razor)带有Section的视图母版页教程 ASP.NET Cor ...
- ASP.NET Core 入门笔记7,ASP.NET Core MVC 视图布局入门
一.前言 1.本教程主要内容 ASP.NET Core MVC (Razor)视图母版页教程 ASP.NET Core MVC (Razor)带有Section的视图母版页教程 ASP.NET Cor ...
- 原创:从零开始,微信小程序新手入门宝典《一》
为了方便大家了解并入门微信小程序,我将一些可能会需要的知识,列在这里,让大家方便的从零开始学习:一:微信小程序的特点张小龙:张小龙全面阐述小程序,推荐通读此文: 小程序是一种不需要下载.安装即可使用的 ...
- 课程上线 -“新手入门 : Windows Phone 8.1 开发”
经过近1个月的准备和录制,“新手入门 : Windows Phone 8.1 开发”系列课程已经在Microsoft 虚拟学院上线,链接地址为:http://www.microsoftvirtuala ...
- Linux 新手入门教程
Linux 新手入门教程 1991年10月5日,Linus Torvalds 在互联网上发布消息,宣布他自己开发的内核系统诞生了.他将内核源代码保存在芬兰最大的 FTP 网站上,命名为 Linux,取 ...
- 从零开始:微信小程序新手入门宝典《一》
为了方便大家了解并入门微信小程序,我将一些可能会需要的知识,列在这里,让大家方便的从零开始学习: 一:微信小程序的特点 张小龙:张小龙全面阐述小程序,推荐通读此文: 小程序是一种不需要下载.安装即可使 ...
- MVVM Light 新手入门(2) :ViewModel / Model 中定义“属性” ,并在View中调用
今天学习MVVM架构中“属性”的添加并调用,特记录如下,学习资料均来自于网络,特别感谢翁智华的利刃 MVVMLight系列. 一个窗口的基本模型如下: View(视图) -> ViewModel ...
随机推荐
- TienChin-课程管理-课程更新接口
更改包名 将之前的 entity 更改为 domain: 将之前的 validator 包当中的校验分组接口移动到 common 模块当中,因为其它模块也需要使用就放到公共当中进行存储. 更改完毕之后 ...
- 19.8 Boost Asio 异或加密传输
异或加密是一种对称加密算法,通常用于加密二进制数据.异或操作的本质是对两个二进制数字进行比较,如果它们相同则返回0,如果不同则返回1.异或加密使用一把密钥将明文与密文进行异或运算,从而产生密文.同时, ...
- C/C++ 实现切片免杀的思路
今天突然想到了一个好玩的免杀思路,原理就是想办法切断磁盘特征与内存特征,关于沙盒免杀我寻思着,这样可以将不同的的DLL映射到内存,在内存中他们的特征也是被切断的,在注入器上做判断如果是沙盒则不加载,不 ...
- C/C++ x64 Inline Hook 代码封装
Hook 技术常被叫做挂钩技术,挂钩技术其实早在DOS时代就已经存在了,该技术是Windows系统用于替代DOS中断机制的具体实现,钩子的含义就是在程序还没有调用系统函数之前,钩子捕获调用消息并获得控 ...
- C/C++ ShellCode 常用加密方式
异或加密ShellCode: #include <stdio.h> #include <Windows.h> unsigned char buf[] = "\xba\ ...
- 小知识:Oracle中的层次查询
使用Oracle中的start with .. connect by prior ..语句可以轻松实现. 下面通过scott用户下的emp来做演示,使用自己的一个19c测试环境,结果发现默认并没有sc ...
- [Spring 6.0源码解析] @Configuration注解源码解析
Spring 6.0源码解析之@Configuration 首先写一个启动代码: public class ConfigurationAnnotationTest { private static f ...
- 【SpringBootStarter】自定义全局加解密组件
[SpringBootStarter] 目的 了解SpringBoot Starter相关概念以及开发流程 实现自定义SpringBoot Starter(全局加解密) 了解测试流程 优化 最终引用的 ...
- Sunnyui画曲线溢出错误
之前用sunnyui做展示数据库数据曲线的时候.偶然会报溢出错误,也不报错错误在哪,就是直接程序都跑不动了. 后面发现 设置曲线上下限的时候,当上下限一样的时候就会导致溢出错误.sunnyui的曲线也 ...
- NC51216 花店橱窗
题目链接 题目 题目描述 小q和他的老婆小z最近开了一家花店,他们准备把店里最好看的花都摆在橱窗里. 但是他们有很多花瓶,每个花瓶都具有各自的特点,因此,当各个花瓶中放入不同的花束时,会产生不同的美学 ...