很多時候,我們需要按照不同的條件顯示不同的效果,在傳統的軟件開發中,我們會直接使用 控件名稱.BackColor,Enable,Visible等屬性進行控制。
如果一個業務對象在多處使用,要么我們會去一個地方一個地方的修改,要么會集中代碼做個方法進行控制。
在XAF中,就實現了一處控制全局生效的方法。
下面我們來看看外觀模塊:
上圖中展示了幾種效果:1,整行紅色背景。2,藍色字體加刪除線。3編輯時控件禁用。4.單元格顏色變化。
詳細界面中,同樣生效了,上面兩幅圖,一個是web的,一個winform的。
下面我們演示如何制作相同的效果:
[DefaultClassOptions] //[ImageName("BO_Contact")] //[DefaultProperty("DisplayMemberNameForLookupEditorsOfThisType")] //[DefaultListViewOptions(MasterDetailMode.ListViewOnly, false, NewItemRowPosition.None)] //[Persistent("DatabaseTableName")] // Specify more UI options using a declarative approach (https://documentation.devexpress.com/eXpressAppFramework/CustomDocument112701.aspx). [Appearance("紅色禁用","ViewItem", BackColor ="Red",TargetItems ="*",Criteria ="禁用")] [Appearance("藍色未審批","ViewItem", BackColor = "Blue", TargetItems = "*", Criteria = "!已審核")] public class 客戶 : BaseObject {
在客戶類上面寫兩條Appearance Attribute即可。
先看效果:
很簡單的兩條語句就有了效果,點擊進入詳細視圖后,也是同樣生效的。
我們再去XAFML看看外觀規則:
看起來比代碼下面容易理解多了,但是XAF的開發人員習慣是在代碼中寫規則,這樣更快,否則還要切換到xafml中,一會寫代碼,一會設置xafml也是夠煩了。
所以我們的選擇就是傳說中的code first充血模型。
下面把上圖中每個屬性的功能說一下:
AppearanceItemType:要控制的項目
值 | 說明 | |
---|---|---|
![]() |
Action | 要控制的是按鈕 |
![]() |
LayoutItem | 詳細界面中使用的布局項目的名稱 |
![]() |
ViewItem | 可以簡單的理解為屬性的名稱,在詳細視圖中除了屬性會生成對應的ViewItem,還可以手工的建立如靜態文本、靜態圖像類的ViewItem,當然那些也在控制范圍內。 |
Context:
可選值 | Appearance Rule's Activity Scope | 舉例 |
---|---|---|
內置了三種類型 DetailView ListView Any. | 詳細視圖,列表視圖或所有視圖. | Any |
指定的視圖ID | 只生效於指定的視圖. | MyClass_ListView;MyClass_DetailView |
Any;視圖名稱 | 所有視圖,但除Any后面列出的視圖名稱 | Any;MyClass_ListView;MyClass_LookupListView |
"DetailView" 或 "ListView" 后跟視圖名稱. | 所有列表視圖,和指定的視圖 | DetailView;MyClass_ListView |
Criteria:滿足指定的條件時生效,如 年齡>20
Method:可以在指定的方法返回true值時規則才生效,如:
using DevExpress.ExpressApp.ConditionalAppearance; //... public class Product : BaseObject { public Product(Session session) : base(session) { } public decimal Price { //... } public ProductStatus Status { //... } [Appearance("RuleMethod", AppearanceItemType = "ViewItem", TargetItems = "*", Context = "ListView", BackColor = "Green", FontColor = "Black")] public bool RuleMethod() { if (Price < 10 && Status == ProductStatus.Active) { return true; } else { return false; } } }
Priority :如果有多個規則應用於同一個元素上,將按這個優先級決定哪個會生效,值越大優先級越高。
TargetItems:
示例 | 說明 |
---|---|
"TargetElementId" 目標元素ID | 比如填寫屬性的名稱,LayoutItem的名稱 |
"TargetElementId1;TargetElementId2" | 多個元素的ID,使用分號分隔 |
"*" | 所有元素 |
"*;TargetElementId1;TargetElementId2" | 所有元素,除*號后面的指定的元素之外 |
BackColor:背景顏色
Enable:如果指定的是ViewItem,LayoutItem是指控件是否可用。如果是按鈕,是指是否可以點擊。
FontColor:字體顏色
FontStyle:字體樣式,比如加粗,加刪除線之類的。
Visibility:是否可見。
下表展示了效果生效的環境:
個性化 | 列表單元格 | 列表編輯模式 | 詳細視圖 | 詳細視圖 靜態文字 |
布局項目 | 布局組、TAB | 按鈕 |
---|---|---|---|---|---|---|---|
Font Color | 支持 | 支持 | 支持 | 支持 | 支持 | ||
Font Style | 支持 | 支持 | 支持 | 支持 | 支持 | ||
Back Color | 支持 | 支持 | 支持 | 支持 | |||
Enabled/Disabled | 支持 | 支持 | 支持 | ||||
Visible/Invisible | 支持 | 支持 | 支持 | 支持 |
比如,在列表中,Visible的控制,一個列表有很多行所以肯定是沒辦法做到有些行的內容是隱藏的,有些行的內容是可見的。
Appearance的功能就介紹到這里。
QQ4603528 群:336090194