基於步入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 } }