Conditional Appearance 可以根据不同条件给予UI元素不同的外观。可改变的外观包括:字体,背景,Action的可见性和使能/禁用,改变布局元素的外观等等。下面是使用Conditional Appearance的一个简单例子。
首先,将ConditionalAppearance Module 添加到Module项目的Module.cs文件中,如图1所示:
图1 添加Conditional Appearance Module
在类名(属性名)上修饰Appearance特性。
[Appearance("Appearance1", AppearanceItemType = "ViewItem", TargetItems = "Text",
Criteria = "Number > 30", Context = "ListView", BackColor = "Red", Priority = 1)]
[Appearance("Appearance2", AppearanceItemType = "ViewItem", TargetItems = "Text",
Criteria = "Text = 'ok'", Context = "ListView", BackColor = "Blue", Priority = 2)]
[Appearance("Appearance3", AppearanceItemType = "ViewItem", TargetItems = "*",
Criteria = "Text2 = 'yes'", Context = "ListView",FontColor="Blue", BackColor = "Yellow", Priority = 1)]
[Appearance("ActionVisibility", AppearanceItemType = "Action",
TargetItems = "Delete",
Criteria = "Text2 = 'del'", Context = "Any", Visibility = ViewItemVisibility.Hide)]
[Appearance("ActionEnable", AppearanceItemType = "Action",
TargetItems = "New",
Criteria = "Text2 = 'new'", Context = "Any", Enabled=false)]
public class TestObject : XPObject
{//...
public int Number{/*...*/}
public string Text{/*...*/}
public string Text2{/*...*/}
[Appearance("RuleMethod", AppearanceItemType = "ViewItem", TargetItems = "*",
Context = "ListView", BackColor = "Green", FontColor = "Black",FontStyle=FontStyle.Strikeout)]
public bool RuleMethod()
{
if (Number ==100 && Text == "good"&& Text2=="bad")
{
return true;
}
else
{
return false;
}
}
}
效果如图2所示:
图2 示例效果图
另外,图2中看不出来的是,当选中Text2==”del”的记录时,删除按钮被隐藏了,选中Text2==”new”的记录时,新建按钮被禁用了。
Appearance特性的构造参数第一个为Id,下面说说Appearance的几个属性值的含义。
AppearanceAttribute.AppearanceItemType
指定被规则影响的UI元素类型,可以为ViewItem(ListView的属性,PropertyEditor或StaticText), LayoutItem或Action
AppearanceAttribute.TargetItems
指定被规则影响的UI元素Id,如示例中的TargetItems = "Text",则仅将规则作用于Text属性,可以用“,”分割多个UI元素,也可为“*”表满足规则的全部元素
AppearanceAttribute.Context
指定规则适用的上下文,可以为”ListView”, “DetailView”, “Any”或具体的上下文如”TestObject_ListView”,可以用逗号分隔多个UI元素
AppearanceAttribute.Criteria
指定规则的条件
AppearanceAttribute.BackColor
背景色
AppearanceAttribute.FontColor
字体色
AppearanceAttribute.FontStyle
字体
AppearanceAttribute.Enabled
指定UI是否使能
AppearanceAttribute.Visibility
指定UI元素可见性
AppearanceAttribute.Method
用于指定复杂的条件
AppearanceAttribute.Priority
当多个规则影响同一UI元素时,优先级大的有效,注意优先级不影响UI可见性,隐藏项目的优先级永远高于其他规则
AppearanceModule提供了AppearanceController控制器,它拥有以下几个事件。
AppearanceApplied
当规则应用到UI元素后可利用该事件做出一些更改
CustomApplyAppearance
覆盖默认的应用规则的流程或取消某规则流程
CollectAppearanceRules
动态增加一些规则
一.使用AppearanceApplied更改规则
当选中Number==100,Text==”good”,Text2==”bad”这条记录时,重置背景色,且将字体变为粗体蓝色,如图3所示。另外,还可以利用IAppearanceEnabled, IAppearanceVisibility更改可见性和使能/禁用。
public partial class MyAppearanceController : ViewController
{
public MyAppearanceController()
{
InitializeComponent();
RegisterActions(components);
TargetObjectType = typeof(TestObject);
}
private AppearanceController appearanceController;
protected override void OnActivated()
{
base.OnActivated();
appearanceController = Frame.GetController<AppearanceController>();
if (appearanceController != null)
{
appearanceController.AppearanceApplied +=
new EventHandler<ApplyAppearanceEventArgs>(
appearanceController_AppearanceApplied);
}
}
void appearanceController_AppearanceApplied(
object sender, ApplyAppearanceEventArgs e)
{
if ((View is ListView) && (e.ItemType == AppearanceItemType.ViewItem.ToString()) &&
(e.ContextObjects.Length > 0))
{
if (View.SelectedObjects.Contains(e.ContextObjects[0]))
{
TestObject t=View.SelectedObjects[0] as TestObject;
if (t != null && t.Number == 100&&t.Text=="good"&&t.Text2=="bad")
{
IAppearanceFormat formattedItem = e.Item as IAppearanceFormat;
if (formattedItem != null)
{
formattedItem.ResetBackColor();
formattedItem.FontStyle = System.Drawing.FontStyle.Bold;
formattedItem.FontColor = System.Drawing.Color.Blue;
}
}
}
}
}
protected override void OnDeactivated()
{
if (appearanceController != null)
{
appearanceController.AppearanceApplied -=
new EventHandler<ApplyAppearanceEventArgs>(
appearanceController_AppearanceApplied);
}
base.OnDeactivated();
}
}
图3 更改规则效果图
AppearanceApplied和CustomApplyAppearance事件处理参数都是 ApplyAppearanceEventArgs,它又包含了以下属性:
当前应用的外观,该对象包含了BackColor, Enabled, FontColor, FontStyle, Visibility设置情况 | |
条件外观应用到的上下文对象,本例中为TestObject对象. | |
Handled | 是否成功处理事件,true是且中断后续处理而返回,false则继续转交给后续事件 |
即Appearance特性的TargetItems属性 | |
即Appearance特性的TargetItems属性名称 | |
即Appearance特性的AppearanceItemType属性 |
二.使用CustomApplyAppearance覆盖或更改规则执行流程
下面的代码取消禁用新建按钮,当选中Text2==”new”的记录时,新建按钮不再被禁用了。
public partial class MyAppearanceController : ViewController
{//...
private AppearanceController appearanceController;
protected override void OnActivated()
{
base.OnActivated();
appearanceController = Frame.GetController<AppearanceController>();
if (appearanceController != null)
{
appearanceController.CustomApplyAppearance +=
new EventHandler<ApplyAppearanceEventArgs>(
appearanceController_CustomApplyAppearance);
}
}
void appearanceController_CustomApplyAppearance(
object sender, ApplyAppearanceEventArgs e)
{
if (e.AppearanceObject.Enabled == false)
{
CustomizeDisabledEditorsAppearance(e);
e.Handled = true;
}
}
protected virtual void CustomizeDisabledEditorsAppearance(ApplyAppearanceEventArgs e) { }
protected override void OnDeactivated()
{
if (appearanceController != null)
{
appearanceController.AppearanceApplied -=
new EventHandler<ApplyAppearanceEventArgs>(
appearanceController_CustomApplyAppearance);
}
base.OnDeactivated();
}
在上面代码中,e.Handled=true,将不再向下继续传递该事件。若要修改默认的自定义外观,则可以添加CustomizeDisabledEditorsAppearance方法的内容,或者继承MyAppearanceController并在子类中重写CustomizeDisabledEditorsAppearance方法。如帮助文档http://documentation.devexpress.com/#Xaf/CustomDocument3374/AppearanceApplied
三.使用CollectAppearanceRules增加规则
参考帮助文档http://documentation.devexpress.com/#Xaf/CustomDocument3374/AppearanceApplied