1. 程式人生 > >UIContext -- 自動儲存/恢復窗體控制元件的屬性值

UIContext -- 自動儲存/恢復窗體控制元件的屬性值

UIContext,是本人在程式設計實踐中用於在Winform窗體程式中用於儲存使用者的個性化配置資訊的工具類。

主要用於儲存和恢復窗體(Form)中的一些控制元件的屬性。比如:

典型應用是某個文字框的預設值,使用者希望下次進入後,該文字框還是最後一次輸入的內容。

 或者使用者選擇了下拉列表中某一項作為一個相對固定的選擇,下一次他就不需要再作重複選擇,UIContext自動幫他恢復這一選項。

 

下面列出UIContext主要的方法或屬性:

屬性或方法

 說明

public

UIContext(object contextObject)

建構函式

public staticstring UserDataDir

儲存使用者個人配置的資料夾

public void Load(string propertyName)

從配置中獲取並設定本窗體的指定控制元件的屬性值

public void Load(string propertyName,string defaultValue)

從配置中獲取並設定本窗體的指定控制元件的屬性值,

如果為空則設定預設值

public void Save()

將本物件的使用者配置值儲存到記憶體中

public staticvoid LoadAllFromPersistent()

將應用程式所有上下文配置載入到記憶體

public staticvoid SaveAllToPersistent()

將配置持久化儲存到Xml檔案中

public static void LoadContext(UIContext context, string contextSettings) 通過控制元件的屬性名稱列表自動恢復屬性值或欄位值

 

用法示例:

    public partial class FormTest : FormGeneral
    {
        //假定這是一個窗體內的控制元件
        public TextEdit textEdit1 = new TextEdit();

        public FormTest()
        {
            InitializeComponent();

            //在程式執行開始時,從配置檔案載入所有配置
            UIContext.LoadAllFromPersistent();

            //定義本窗體的使用者配置物件
            UIContext context = new UIContext(this);

            //從配置中恢復屬性的值,如果配置檔案沒有值,則預設值為abc
          context.Load("textEdit1.Text=abc");

            //在程式執行過程中,使用者操作改變了值
            textEdit1.Text = "def";

          //儲存使用者輸入的值到配置中, 事實上,這一步可以省略
          //因為,UIContext物件會自動判斷它的上下文物件型別,如果是窗體,則會在窗體關閉時自動執行這一方法。
            context.Save();

            //程式執行結束前,儲存所有使用者配置到檔案
            UIContext.SaveAllToPersistent();
        }
}

總的說來,使用此類經過以上程式碼所述的6個步驟。 但是,我們可以利用窗體基類進行進一步的封裝,比如:

public partial class FormGeneral : DevExpress.XtraEditors.XtraForm
{
       /// <summary>
       /// 用於儲存窗體狀態的上下文物件
        /// </summary>
        protected UIContext Context;

        public FormGeneral()
        {
           	InitializeComponent();
 		Context = new UIContext(this);
	}

	/// <summary>
        /// 通過上下文字串設定本窗體的屬性值或欄位值
        /// </summary>
        protected void LoadContext(string contextSettings)
        {
            if (String.IsNullOrEmpty(contextSettings)) return;
            UIContext.LoadContext(Context, contextSettings);
        }
}


這樣,當其他的窗體繼承自FormGeneral時,就可以很方便地恢復在配置中的各個控制元件的屬性值了:

protcted void Form_Load(object sender, EventArgs e)
{
	LoadContext("控制元件名.屬性名;控制元件名2.屬性名2;....");
}


也就是說,經過適當的封裝,在最終的子窗體裡面,程式設計師要做的只是呼叫LoadContext方法,引數是將本窗體控制元件名和屬性名羅列出來,用;號分隔就可以了。其他的事,UIContext都幫你做了。比如:

            LoadContext(@"cbxDays.SelectedIndex=6
                            tabShowType.SelectedTabPageIndex
                            ctrlClassTree1.FocusedClassId"
                );


以上的程式碼中,cbxDays是一個下拉列表控制元件,tabShowType是一個選項卡控制元件,而ctrlClassTree1是一個使用者控制元件,有一個屬性FocusedClassId.

UIContext將自動恢復這些控制元件的屬性到上一次儲存後的值。並在窗體關閉時再次儲存使用者的選擇項。

如果各位覺得這個UIContext還有一點用處,請頂貼。我將發實現的原始碼。

雖然此工具類處理窗體是最典型的應用,它也可以處理其他任何object物件屬性的存取,從而實現一些非常巧妙的組合應用。