使用DevExpress改變WinForm皮膚(VS)


基於步入DevExpress的使用(VS),進一步使用DevExpress改變WinForm皮膚,適合初學者。

提示:

1、對於DevExpress菜單中的RepositoryItemComboBox沒有EditValue屬性,無法直接獲取選擇的值,但可以在其事件中將其轉化為ComboBoxEdit控件來獲取。如下:

private void repositoryItemComboBox1_SelectedValueChanged(object sender, EventArgs e)
{ 
     ComboBoxEdit riComboBox = sender as ComboBoxEdit;
     string skinName = riComboBox.EditValue.ToString();
} 

2、在設計界面代碼如:BaseFormDesigner.cs中,手動給指定控件(RepositoryItemComboBox)添加事件,代碼如下:

 this.repositoryItemComboBox1.SelectedValueChanged += new System.EventHandler(this.repositoryItemComboBox1_SelectedValueChanged);

  在對應的BaseForm.cs中實現其具體功能,代碼如下:

        /// <summary>
        /// 手動添加的 Combobox菜單項值改變時,觸發的事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void repositoryItemComboBox1_SelectedValueChanged(object sender, EventArgs e)
        {
            ComboBoxEdit repositoryItemComboBox = sender as ComboBoxEdit;
            this.defaultLookAndFeel1.LookAndFeel.SkinName = repositoryItemComboBox.EditValue.ToString();     
        }

 

代碼間關系:Program類主要注冊要使用的皮膚及運行那個界面;CommonFunctions類主要實現共用的函數;BaseForm類繼承自DevExpress.XtraEditors.XtraForm,主要實現一些基礎共用的操作;SkinSubject類主要積累那些類共用BaseForm類的通用操作或共性(單例、簡單觀察者來實現);AppFormA、AppFormB類都繼承自BaseForm類,共用BaseForm類特性。

 

具體實例代碼(不含界面設計代碼)如下:

 

Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;


namespace TestExpressSkins
{
    static class Program
    {
        /// <summary>
        /// 應用程序的主入口點。
        /// </summary>
        [STAThread]
        static void Main()
        {
            DevExpress.UserSkins.BonusSkins.Register();
            DevExpress.UserSkins.OfficeSkins.Register();
            DevExpress.Skins.SkinManager.EnableFormSkins();
            
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            //Application.Run(new BaseForm());
            //Application.Run(new AppFormA());
            Application.Run( AppFormA.Singlon());
        }
    }
}

  

CommonFunctions.cs

using DevExpress.XtraBars;
using DevExpress.XtraEditors;
using DevExpress.XtraEditors.Repository;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TestExpressSkins
{
    class CommonFunctions
    {
        #region 字段

        

        #endregion

        #region 單例

        private static CommonFunctions commFuncInstance = null;

        private CommonFunctions()
        {
        }

        public static CommonFunctions Singlon()
        {
            if (null == commFuncInstance)
            {
                commFuncInstance = new CommonFunctions();
            }
            return commFuncInstance;
        }

        #endregion

        #region 共有方法
        /// <summary>
        /// 皮膚全部枚舉出來放到一個ComboBoxEdit中
        /// </summary>
        /// <param name="comboBoxEdit"></param>
        public void AddAppStyles2ComboBoxEdit(ComboBoxEdit comboBoxEdit)
        {
            foreach (DevExpress.Skins.SkinContainer skin in DevExpress.Skins.SkinManager.Default.Skins)
            {
                comboBoxEdit.Properties.Items.Add(skin.SkinName);
            }
        }

        /// <summary>
        /// 皮膚全部枚舉出來放到一個ComboBoxEdit中
        /// </summary>
        /// <param name="repositoryItemComboBox"></param>
        public void AddAppStyles2RepositoryItemComboBox(RepositoryItemComboBox repositoryItemComboBox)
        {
            foreach (DevExpress.Skins.SkinContainer skin in DevExpress.Skins.SkinManager.Default.Skins)
            {
                repositoryItemComboBox.Items.Add(skin.SkinName);
            }
        }


        public void AddAppStyles2BarEditItem(BarEditItem barEditItem)
        {
            string editItemType = barEditItem.GetType().ToString();
            switch (editItemType)
            {
                case "RepositoryItemComboBox":
                    AddAppStyles2RepositoryItemComboBox(barEditItem.Edit as RepositoryItemComboBox);
                    break;
                case "RepositoryItem**":

                    break;
                case "RepositoryItem***":
                    
                    break;

            }
        }



        #endregion

        #region 私有方法


        public bool tmpFunc()
        {
            bool bFlag = true;

            return bFlag;
        }


        #endregion
    }
}

 SkinSubject.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TestExpressSkins
{
    public class SkinSubject
    {
        #region 字段


        private List<BaseForm> forms = new List<BaseForm>();        //同一樣式的對話框集合


        #endregion

        #region 單例

        private static SkinSubject subject = null;

        public static SkinSubject GetInstance()
        {
            if (subject == null) subject = new SkinSubject();
            return subject;
        }

        private SkinSubject() { }

        #endregion

        #region 共有方法
        /// <summary>
        /// 注冊觀察者
        /// </summary>
        /// <param name="f"></param>
        public void Register(BaseForm f)
        {
            forms.Add(f);
        }

        /// <summary>
        /// 注銷觀察者
        /// </summary>
        /// <param name="f"></param>
        public void UnRegister(BaseForm f)
        {
            forms.Remove(f);
        }

        /// <summary>
        /// 修改每個觀察者的皮膚
        /// </summary>
        /// <param name="skinName"></param>
        public void Notify(string skinName)
        {
            foreach (BaseForm f in forms)
            {
                f.LookAndFeelControl.LookAndFeel.SkinName = skinName;
            }
        }


        #endregion

        #region 私有方法



        #endregion
    }
}

  

BaseForm.cs

using DevExpress.LookAndFeel;
using DevExpress.XtraBars;
using DevExpress.XtraEditors;
using DevExpress.XtraEditors.Repository;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace TestExpressSkins
{
    public partial class BaseForm : DevExpress.XtraEditors.XtraForm            //Form
    {
        #region 字段

        private CommonFunctions commFunc = null;

        #endregion

        #region 屬性

        public DefaultLookAndFeel LookAndFeelControl
        {
            set
            {
            }

            get
            {
                return this.defaultLookAndFeel1;
            }
        }

        public int tempA
        {
            set
            {
            }

            get
            {
                return 1;
            }
        }

        #endregion

        #region 構造函數

        public BaseForm()
        {
            InitializeComponent();
            commFunc = CommonFunctions.Singlon();
        }

        #endregion

        #region 對話框或空間相關方法

        private void Form1_Load(object sender, EventArgs e)
        {
            commFunc.AddAppStyles2ComboBoxEdit(cmbAppStyle);
            commFunc.AddAppStyles2RepositoryItemComboBox(this.repositoryItemComboBox1);
        }

        private void cmbAppStyle_SelectedIndexChanged(object sender, EventArgs e)
        {
            this.defaultLookAndFeel1.LookAndFeel.SkinName = cmbAppStyle.EditValue.ToString();
        }

        /// <summary>
        /// 手動添加的 Combobox菜單項值改變時,觸發的事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void repositoryItemComboBox1_SelectedValueChanged(object sender, EventArgs e)
        {
            ComboBoxEdit repositoryItemComboBox = sender as ComboBoxEdit;
            this.defaultLookAndFeel1.LookAndFeel.SkinName = repositoryItemComboBox.EditValue.ToString();     
        }

        #endregion

        #region 私有方法



        #endregion
    }
}

  

AppFormA.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace TestExpressSkins
{
    public partial class AppFormA : BaseForm            //Form
    {
        #region 字段

        BaseForm appFormB = null;

        #endregion

        #region 屬性

        public int tempA
        {
            set
            {
            }

            get
            {
                return 1;
            }
        }

        #endregion

        #region 單例

        private static AppFormA appFormAInstance = null;

        #region 構造函數

        private AppFormA()
        {
            InitializeComponent();
            SkinSubject.GetInstance().Register(this);
        }

        #endregion

        public static AppFormA Singlon()
        {
            if (null == appFormAInstance)
            {
                appFormAInstance = new AppFormA();
            }
            return appFormAInstance;
        }

        #endregion

        #region 對話框或空間相關方法

        private void bGo2B_Click(object sender, EventArgs e)
        {
            //if (null == appFormB)
            //{
            //    appFormB = new AppFormB();
            //}
            appFormB = AppFormB.Singlon();
            this.Hide();
            appFormB.Show();
        }

        #endregion

        #region 私有方法



        #endregion
    }
}

  

 

AppFormB.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace TestExpressSkins
{
    public partial class AppFormB : BaseForm            //Form
    {
        #region 字段

        BaseForm appFormA = null;

        #endregion

        #region 屬性

        public int tempA
        {
            set
            {
            }

            get
            {
                return 1;
            }
        }

        #endregion
        
        #region 單例

        private static AppFormB appFormBInstance = null;

        #region 構造函數

        private AppFormB()
        {
            InitializeComponent();
            SkinSubject.GetInstance().Register(this);
        }

        #endregion

        public static AppFormB Singlon()
        {
            if (null == appFormBInstance)
            {
                appFormBInstance = new AppFormB();
            }
            return appFormBInstance;
        }

        #endregion

        #region 對話框或空間相關方法

        private void bGo2A_Click(object sender, EventArgs e)
        {
            //if (null == appFormA)
            //{
            //    appFormA = new AppFormA();
            //}
            appFormA = AppFormA.Singlon();
            this.Hide();
            appFormA.Show();
        }

        #endregion

        #region 私有方法



        #endregion
    }
}

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM