Windows Forms Application Creation and Initialization
Windows Forms Application Creation and Initialization
This topic details the steps performed after an end-user has run an XAF Windows Forms application, until the moment the main XAF objects, like the WinApplication, are created and initialized.
In the following image, you can see that the entire process of application creation and initialization can be divided into four steps.

The table below describes all these steps in detail.
| Stage | Description | Ways to Interfere |
|---|---|---|
| Create an Application | An instance of the WinApplication is created. This is performed by the Program.Main method, automatically generated in your Windows Forms application project. | |
| Initial Application Initialization | A newly created application is initialized. The settings that are specified in the configuration file's appSettings section are read to the application: | |
|
The XafApplication.TablePrefixes property is set to the value assigned to the TablePrefixes key in the configuration file. |
If it is not necessary for you to set table prefixes in the configuration file, you can do it in code. To do this, set the TablePrefixes property after an application object has been created, but before its XafApplication.Setup method is called. | |
|
The location to be used to store the Model.User.xafml file is specified by the UserModelDiffsLocation key. |
||
|
The location to be used to store the application's Log file is specified by the TraceLogLocation key. |
||
| Application Initialization by the Designer | Then, the application is initialized by the values specified in the Application Designer. This is performed by the InitializeComponent method, automatically called in the constructor of your WinApplication class. | |
|
The XafApplication.Modules collection is populated by the modules added to the Modules section in the Designer. Each module is set up. This means that the current WinApplication instance is assigned to the ModuleBase.Applicationproperty. |
If you need to add a module that is not registered in the Toolbox, and so cannot be added via the Designer, use one of the following approaches: Specify the required module name(s) in the application project's configuration file. Pass this string as a parameter of the XafApplication.Setupmethod in the Program.Main method. Add this module to the module that is contained in your solution. To do this, use the ModuleBase.RequiredModuleTypes collection. To see code samples of both these approaches, refer to the Ways to Register a Module topic. You can perform custom actions with a module, in addition to setting the Application object. To do this, override the module's ModuleBase.Setup method. |
|
|
The XafApplication.Connection property is set to the object of the type specified in the Designer's Connection section. The connection string is specified in the Properties grid when the Connection section is selected. |
You can avoid the use of the Designer by applying one of the following techniques: Specify the connection string in the application project's configuration file. Assign this string to the XafApplication.ConnectionString property (see this property's description). Set the XafApplication.Connection and/or XafApplication.ConnectionString property before the XafApplication.Setup method is called. |
|
|
The XafApplication.Security property is set to the object of the type specified in the Designer's Security section. The authentication strategy to be used by the Security System is specified in the same section. The User type to be used by the Security System is specified in the Properties grid when the Security section is selected. |
The eXpressApp Framework supplies two security system types: SecuritySimple and SecurityComplex. You can set them using the Application Designer. If you need to use a custom security type that implements the ISecurity interface, create and assign it to the XafApplication.Security property in code, before the XafApplication.Setup method is called. If you need to use a custom authentication strategy or a custom User type, initialize them and the XafApplication.Security property, before the XafApplication.Setup method is invoked.
If you do not initialize a security system via the Application Designer or in code, a SecurityDummy will be used. This security type allows all operations with all types of objects. That's why the presence of the security system is invisible when you run an application. |
|
|
The XafApplication.ApplicationName property is set to the value that is specified in the Properties grid when the Application section is selected. |
You can assign a custom value to the XafApplication.ApplicationName property in code - before the XafApplication.Setup method is called. | |
| Application Initialization by the Setupmethod | The XafApplication.Setup method is called. This is performed by the Program.Mainmethod that is automatically generated in your Windows Forms application project. There are several overloads of the Setup method. By default, the method without parameters is called. It leaves the properties that are already initialized as they are, and proceeds with the initialization process using default values: |
You can call the Setup method with the required parameters, depending on what custom objects you need to create. However, we recommend that you use the approaches presented above, instead. |
|
A default splash screen form (DevExpress.ExpressApp.Win.Core.SplashScreen) is shown. |
You can set a custom splash screen using the WinApplication.SplashScreen property. The custom splash screen must implement the ISplashinterface. To see an example, refer to the How to: Use a Custom Splash Screen topic. | |
|
A default Object Space Provider (see XafApplication.ObjectSpaceProvider) is created using the connection string specified by the XafApplication.ConnectionStringproperty. |
To create a custom Object Space Provider subscribe to the XafApplication.CreateCustomObjectSpaceProvider event, before the Setup method is called. Alternatively, pass the required ObjectSpaceProvider object, using the Setup method as a parameter. You can override the XAFApplication.CreateDefaultObjectSpaceProvider method in your WinApplication class descendant. This method is called when no custom approaches to pass an Object Space Provider are used. This method creates an instance of the built-in ObjectSpaceProvider class. You can return an instance of another class that implements the IObjectSpaceProvider interface. |
|
|
A default Controllers Manager (ControllersManager) is created. This object contains a collection of all the Controllers that are declared in the registered modules. |
You can override the XAFApplication.CreateControllersManager method in your WinApplication class descendant. This method creates an instance of the built-in ControllersManager class. You can return an instance of another class. | |
|
A default Modules Manager (ApplicationModulesManager) is created. This object contains the Modules collection with the modules to be used by the application. This collection is populated by the modules from the XafApplication.Modulescollection. In addition, the SystemModule is added as a default module. |
You can override the XAFApplication.GetDefaultModuleTypes method in your WinApplication class descendant. This method creates an instance of the built-in ApplicationModulesManager class. You can return an instance of another class. In addition, you can override the GetDefaultModuleTypes method to return modules to be added to the application by default, in addition to the System module. |
|
|
A default Application Model Differences Store (FileModelStore) is created. |
If you need to store an Application Model's differences in a place that is different from an XafML file, you can create a custom Application Model Differences Store. To do this, subscribe to the XafApplication.CreateCustomModelDifferenceStore event before the Setup method is called, or override the WinApplication.CreateModelDifferenceStoreCore method in your WinApplication class descendant. | |
|
The Object Space Provider and Controllers Manager are assigned to the application's corresponding properties: XafApplication.ObjectSpaceProvider and ControllersManager. |
Subscribe to the XafApplication.SettingUp event, to customize the objects to be assigned to the application object. Use the event handler's parameters to access the required objects. | |
|
The modules from the Modules Manager's Modules collection are added to the XafApplication.Modules collection of the current application, since at this step the latter collection includes the modules that are only added via the Application Designer. |
||
|
The Application Model Manager (ApplicationModelsManager) which manages the creation and initialization of the Application Model is instantiated. |
||
|
The Application Model is created. Internally, the Application Model has a layered structure, so at first, the actual layers that comprise the Application Model internals are created: |
||
|
The zero layer of the Application Model is created. Initially, it is empty. It is filled with data on demand, during the application life cycle. |
To extend the Application Model, pass the required model interfaces via the application modules' ModuleBase.ExtendModelInterfacesmethods. Alternatively, you can implement the IModelExtender interface in Controllers. To modify existing node generators, implement a generator updater and register it via the ModuleBase.AddGeneratorUpdaters method of a module. For details, refer to the Extend and Customize the Application Model in Code topic. | |
|
A layer for each module used in the application is created. This layer is filled with data from the Model.DesignedDiffs.xafml file that contains Application Model differences created in a particular module. |
To modify this layer's data, modify the required module's XafML file. This can be done, for example, via the Model Editor. | |
|
A layer for the application project is created. This layer is filled with data from the Model.xafml file that contains Application Model differences created in the application project. |
To modify this layer's data, modify the application project's XafML file. This can be done, for example, via the Model Editor. | |
|
Second, all the created layers are wrapped with the master layer. |
The master layer does not contain any information itself. It serves as a proxy for all other layers. Usually, when you access the Application Model, you deal with the master layer. | |
|
The final state of the Application Model is assigned to the XafApplication.Modelproperty. |
Subscribe to the XafApplication.SetupComplete event to create extra objects (helpers, extractors, etc.), after the application has been completely initialized. |
Windows Forms Application Creation and Initialization的更多相关文章
- create Context Menu in Windows Forms application using C# z
In this article let us see how to create Context Menu in Windows Forms application using C# Introduc ...
- Catch Application Exceptions in a Windows Forms Application
You need to handle the System.Windows.Forms.Application.ThreadException event for Windows Forms. Thi ...
- 【C#遗补】获取应用程序路径之System.IO.Directory.GetCurrentDirectory和System.Windows.Forms.Application.StartupPath的区别
原文:[C#遗补]获取应用程序路径之System.IO.Directory.GetCurrentDirectory和System.Windows.Forms.Application.StartupPa ...
- System.Windows.Forms.Application.DoEvents();
关于Application.DoEvents()的小研究 在MSDN中的备注是: 当运行 Windows 窗体时,它将创建新窗体,然后该窗体等待处理事件.该窗体在每次处理事件时,均将处理与该事件关联的 ...
- Windows Forms (一)
导读 1.什么是 Windows Forms 2.需要学Windows Forms 么? 3.如何手写一个简单的Windows Forms 程序 4.对上面程序的说明 5.Form 类与Control ...
- 如何为Windows Forms应用程序添加启动参数(Start-Up Parameters)
很多场合下,我们需要通过命令行或者快捷方式在Windows Forms程序启动时向其传递参数. 这些参数可能是用来加载某一个文档,或者是应用程序的初始化配置文件. 特别是对那些需要高度自定义配置的大程 ...
- 体验Visual Studio 2015 Windows Forms应用程序开发与维护
昨天到半夜还没有等到Visual Studio 2015的下载地址,实在熬不住就先休息了.北美地区的时区比北京时间要晚一些,今天早上到公司就看到Visual Studio 2015的下载地址,迅速的将 ...
- Double Buffering Windows Forms
Double Buffering Windows Forms As much as we would like it not to be the case, graphics can be slow ...
- C# Windows Forms 事件处理顺序
事件引发的顺序对某些Windows 窗体应用来说十分重要.当某些事件需要特别处理时(如重绘窗体的某些部分),必须知道事件在运行时的确切引发顺序.下面就应用程序和控件的生命周期中的几个重要阶段的事件顺序 ...
随机推荐
- Linux学习之路-2017/12/25
三章 命令通配符 .PATH变量 支持多种文本的通配符 通配符 含义 * 匹配零个或多个字符 ? 匹配任意单个字符 [0-9] 匹配范围内的数字 [ ...
- 通过Python实现一个文档的半自动录入工具
需求出现/使用场景: 因为公司需要将word办的接口文档在线化,看起来是个很好的事情,但是就是苦逼了我们这些干活的,其中工程量最大的就是参数的录入,要是参数少也罢,有的接口动辄三四十个参数,更甚八九十 ...
- redis-Sentinel配置
Sentinel介绍 Redis的主从模式下,主节点一旦发生故障不能提供服务,需要人 工干预,将从节点晋升为主节点,同时还需要修改客户端配置. 对于很多应用场景这种方式无法接受. Redis从 2.8 ...
- UVa 1412 - Fund Management(状压DP + 预处理)
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- [JLOI2009]二叉树问题
嘟嘟嘟 对于求深度和宽度都很好维护.深度dfs时维护就行,宽度统计同一个深度的节点有多少个,然后取max. 对于求距离,我刚开始以为是要走到根节点在回来,然后固输了(dep[u] - 1) * 2 + ...
- 也谈SpringCloud:假如 《复仇者联盟4》是一个微服务
前言 <复仇者联盟4>(下文<妇联4>) 将于4月24号上映了,漫威迷们是不是迫不及待了.我虽然不是漫威迷,没有看过相关漫画,但是电影确实一步都不落.不过我在想一个问题:假 ...
- php后台+前端开发过程整理
一.PHP后台从数据库中获取数据 1. 建立数据库连接: //在本项目中封装了数据库的各种操作 $dbConn = $this->_createMysqlConn(); 2. 执行sql语句 $ ...
- java 学习 命令行运行java程序
之前学习python,由于公司需要.现在不得已转java. 1.命令运行java程序. 程序名字:input.java code: /** * Created by liumeide on 2017/ ...
- 1555: Inversion Sequence (通过逆序数复原序列 vector的骚操作!!!)
1555: Inversion Sequence Submit Page Summary Time Limit: 2 Sec Memory Limit: 256 Mb Su ...
- POJ 3468 A Simple Problem with Integers(线段树模板之区间增减更新 区间求和查询)
A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 140120 ...