DevExpress点滴学习--换肤

原文链接:http://www.cnblogs.com/dreamflycc/archive/2012/09/14/2685308.html
一、在项目下新建RibbonForm  命名为:useSkin
二、添加引用DevExpress.OfficeSkins
      DevExpress.UserSkins.BonusSkins

三、将ribbonPage1的Text属性设置为:皮肤

      ribbonPageGroup1的Text属性设置为:更换皮肤

      在ribbonPageGroup1下新建个ribbonGalleryBarItem1,将其Caption的属性设置为:请选择您喜欢的皮肤,并添GalleryItemClick    事件:ribbonGalleryBarItem1_GalleryItemClick

四、在应用程序的主入口里添加:

static void Main()
        {
            //皮肤
            DevExpress.UserSkins.OfficeSkins.Register();
            DevExpress.UserSkins.BonusSkins.Register();
            DevExpress.Skins.SkinManager.EnableFormSkins();

            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Exercises.useSkin());
        }

 

 

五、添加命名空间using System.Xml;

在事件ribbonGalleryBarItem1_Click里添加代码:

private void ribbonGalleryBarItem1_Click(object sender, DevExpress.XtraBars.Ribbon.GalleryItemClickEventArgs e)
        {
            string name = string.Empty;
            string caption = string.Empty;
            if (ribbonGalleryBarItem1.Gallery == null) return;
            caption = ribbonGalleryBarItem1.Gallery.GetCheckedItems()[0].Caption;//主题的描述
            caption = caption.Replace("主题:", "");
            //name = bsiPaintStyle.Manager.PressedLink.Item.Tag.ToString();//主题的名称
            ribbonGalleryBarItem1.Caption = "主题:" + caption;

            XmlDocument doc = new XmlDocument();
            doc.Load("SkinInfo.xml");
            XmlNodeList nodelist = doc.SelectSingleNode("SetSkin").ChildNodes;
            foreach (XmlNode node in nodelist)
            {
                XmlElement xe = (XmlElement)node;//将子节点类型转换为XmlElement类型 
                if (xe.Name == "Skinstring")
                {
                    xe.InnerText = caption;
                }
            }

            doc.Save("SkinInfo.xml");
            //XtraMessageBox.Show("您选择了主题:" + caption);
        }

添加命名空间

using DevExpress.XtraBars.Helpers;
using DevExpress.LookAndFeel;

六、添加命名空间using DevExpress.XtraEditors;

在Load下添加代码:

public string defaultSkinName;//皮肤
        private void useSkin_Load(object sender, EventArgs e)
        {
            SkinHelper.InitSkinGallery(ribbonGalleryBarItem1);
            CheckFile();//检查文件
            GetXmlSkin();//获取xml主题
            UserLookAndFeel.Default.SetSkinStyle(defaultSkinName);//设置主题样式
            ribbonGalleryBarItem1.Caption = "主题:" + defaultSkinName;
        }

        #region 检查XML文件是否存在
        public void CheckFile()
        {
            try
            {
                if (System.IO.File.Exists("SkinInfo.xml") == false)
                {
                    //XtraMessageBox.Show("不存在XML");
                    CreateXml();
                }
            }
            catch (Exception ex)
            {
                XtraMessageBox.Show(ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        #region 创建XML文件

        public void CreateXml()
        {
            XmlDocument doc = new XmlDocument();
            //建立xml定义声明
            XmlDeclaration dec = doc.CreateXmlDeclaration("1.0", "utf-8", null);
            doc.AppendChild(dec);

            //创建根节点
            XmlElement root = doc.CreateElement("SetSkin");
            XmlElement rootone = doc.CreateElement("Skinstring");//皮肤


            //将one,two,插入到root节点下
            doc.AppendChild(root);
            root.AppendChild(rootone);
            doc.Save("SkinInfo.xml");
        }

        #endregion

        #region 读取Xml节点内容

        public void GetXmlSkin()
        {
            try
            {
                XmlDocument mydoc = new XmlDocument();
                mydoc.Load("SkinInfo.xml");
                XmlNode ressNode = mydoc.SelectSingleNode("SetSkin");
                defaultSkinName = ressNode.SelectSingleNode("Skinstring").InnerText;

            }
            catch (Exception ex)
            {
                XtraMessageBox.Show(ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        #endregion

        #endregion

好了,现在就可以为自己的窗体选择喜欢的皮肤了。

看一下效果吧。。。。

       

 

 

转载于:https://www.cnblogs.com/dreamflycc/archive/2012/09/14/2685308.html

展开阅读全文
博主设置当前文章不允许评论。

pfc学习点滴体会

05-13

pfc对于pb的mis开发非常重要。rn重要性首先在于它的正确性与稳定性,这是由很多pfc的开发实践证明的,否则无法解释pfc为何从5到8没有结构上的变化。rn第二个是它提供了一个完整的体系结构,它试图用这个体系结构来应付各种各样的需求变化,实践证明是行之有效的,这也就是各种行业软件的mis开发都能应用pfc。rnrnpfc内部元素的组成来源有两个,一个是继承原有的pb对象,可以叫它对象,如pfc_w_master, pfc_u_dw.另一个是新建的对象,一般称之为服务。如pfc_rowmanager, pfc_linkage.服务主要描述的是控件间的关系。rnrn一般mis应用,mdi应用的比较多。mdi的组成部分主要有application, frame, menu, sheet, userobject, dw. rnpfc针对各部分都提供了功能增强和扩展。rnrnrn增强和扩展的主要方式是rn1是继承,增加实例变量(用于保存状态),增加事件(用于和外部控件提供接口),增加函数(改变自己的状态)。比如sheet继承于windows提供了关闭,打开,等附加功能。rn2是利用服务,这是一种组合的方式,通过检测是否开关服务,可以判断是调用相应的服务处理程序,还是用默认的自身的处理程序。这差不多可以在各个事件都能看到。rn由于从application到dw路径很长,因此提供了一个消息路由功能,提供了一些默认的消息处理路径,和消息发送方式,如menu的。而最大,最主要的消息处理分发功能集中在w_sheet上。这样子可以把开发者的注意力集中到各部分的接口部分,和各部分内部的处理,而不用过多考虑复杂的调用关系,rnrnmis开发的一个主要部分是处理数据库。而处理数据库是pfc的主要方向,这也是把pfc_save事件放到w_sheet的一个主要原因。另一个原因是save消息一般是从菜单或按钮命令发出的,而w_sheet是消息的集中处理地。rnrnu_dw的事件可以从几个部分解剖,retrieve部分,update部分, 数据操纵部分。rn数据操纵需要有两个定位条件,一个是行,一个是列。因此一部分事件是行变换部分,一部分事件是列变换部分。数据操纵是开发的主要部分,因此在rowfocuschange,itemchange事件可以看到大量的服务,而这些服务无外乎是增强本u_dw的功能和建立和其他控件的联系的作用(最典型的是linkage).rnrn考察pfc_save事件,可以看到pfc_w_master的80%的代码都是为pfc_save做准备。而pfc_save也是有7,8个事件组成,而这每个事件又大都遍历所有的u_dw,这也是面向对象所说的,“自己的事情自己做,自己做不了的给上级做”的一个体现。另一方面,又提供了可以为用户在不同层次,随意的在合适的位置添加业务逻辑,可以在不伤害原来代码的情况下,增加业务逻辑。rnrn数据校验有几个层次,1、数据格式不对,2、validition 表达式, 3、本dw的一些业务校验,如不能为空等等,这些能判断出来的就放在pfc_validation去写,4、本dw判断不出的,比如借贷,存盘时要相等,就可以放在pfc_preupdate 去写,总而言之,能尽早处理就尽早处理,攒到最后就处理不过来了,会漏掉的。rnrn再说一说典型的linkage服务,这个服务是提供了主从表服务。而主从表关系体现在行和列上。rn主要逻辑是:rn1、主表行变化时,从表显示对应的行。rn2、主表连接字段变化,从表也变化。rn3、从表增加时,主表必须要有行。而且相应的连接字段必须和主表一致。rn4、主表删除时时间,从表也删除。rn5、主表在有从表的行时,不能把连接字段清空,不能和已有的主表行连接字段内容一样。rn还有一些其他的,也不少,从linkage的代码上可以看出来。rnrn因此linkage调用会发生在rowfocuschanging, rowfocuschanged, itemchanged ,rnitemerror, pfc_deleterow, pfc_addrow,pfc_save等事件上。rn还应该注意到linkage所加的实例变量的目的。rnlinkage会遍历所有的linkage链上的dw,做相应的处理。rn最后可以看一看linkage的保存,是如何解决主从表间有外键的办法,分四次去update,很有趣.rn总结一下,写或读一个服务的主要过程就是,rn1、了解服务的目的。rn2、总结服务所有可能触发的时间。rn3、定义实例变量。rn4、定义事件rn5、定义函数rn6、写代码。rnrn最后我想说,pfc虽然好,但还是要结合自己的开发方式,对它做扩展,才更合用,千万别把pfc挖一块,那样破坏了这个体系的完整性,会有问题的.rnrn希望大家踊跃讨论 论坛

没有更多推荐了,返回首页