XAF之创建条件外观

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,它又包含了以下属性:

AppearanceObject

当前应用的外观,该对象包含了BackColor, Enabled, FontColor, FontStyle, Visibility设置情况

ContextObjects

条件外观应用到的上下文对象,本例中为TestObject对象.

Handled

是否成功处理事件,true是且中断后续处理而返回,false则继续转交给后续事件

Item

即Appearance特性的TargetItems属性

ItemName

即Appearance特性的TargetItems属性名称

ItemType

即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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值