.NET20 一種簡單的窗口控件UI狀態控制方法

 
我們經常需要控制窗口控件的狀態。比如,在某些情況下,需要禁止一部份控件,或讓一部份控件呈只讀狀態等等。
        假如有如下的窗口:
       

        當按下Enable時,左側的所有控件都要禁止(Enabled=false),當按下Disable時,左側的所有控件都取消禁止(Enabled=true)。
        通常的作法是直接用代碼來控制:    

        private void EnableOrDisable(bool isEnabled)
        
{
            
this.button1.Enabled = isEnabled;
            
this.checkBox1.Enabled = isEnabled;
            
this.comboBox1.Enabled = isEnabled;
            
this.textBox1.Enabled = isEnabled;
        }


        
private void btnEnable_Click(object sender, EventArgs e)
        
{
            EnableOrDisable(
true);
        }


        
private void btnDisable_Click(object sender, EventArgs e)
        
{
            EnableOrDisable(
false);
        }


        這樣的作法,在一些簡單的邏輯控制倒也行的通。但是一旦控件的數量比較多,而控制邏輯也比較複雜的時候,類似EnableOrDisable的函數將會變得很多,而且很複雜、不直觀。
        本文介紹一種方法,可以在RAD可視化設計界面中直接指定控件的狀態,並只用很簡單的代碼來切換狀態。

.NET20 一種簡單的窗口控件UI狀態控制方法    沐楓網誌

        首先,定義一個類UiState,類中只有一個屬性“IsEnabled”,用於指定當前控件的禁止狀態:

    class UiState
    
{
        
private bool isEnabled;

        
public bool IsEnabled
        
{
            
get return isEnabled; }
            
set { isEnabled = value; }
        }
 
    }



        然後編譯。必須編譯一次,否則RAD界面不知道有這個類存在。
        接下來,到DataSources側欄中點“增加新數據源”,並在嚮導中選擇“Object”,按下一步:

 

        選擇“UiState”,按“Finish”:

 

        再回到窗口的設計界面,依次設置需要改變狀態的控件。
        如下圖,選中某個控件,到屬性頁中,展開(DataBindings),啓動(Advanced)設置窗口,選擇“Enabled”屬性,並在Binding中選擇“uiStateBindingSource - IsEnabled”。
 

        如下圖,可以在設計窗口檢查綁定狀態:

 

        最後增加Enable和Disable按鈕的處理函數: 

        private UiState uiState = new UiState();

        
public Form1()  // 構造函數
        {
            InitializeComponent();
            uiStateBindingSource.DataSource 
= uiState; // 必須!!!
        }


        
private void EnableOrDisable(bool state)
        
{
            uiState.IsEnabled 
= state;
            uiStateBindingSource.ResetCurrentItem();
        }

        
private void btnEnable_Click(object sender, EventArgs e)
        
{
            EnableOrDisable(
true);
        }


        
private void btnDisable_Click(object sender, EventArgs e)
        
{
            EnableOrDisable(
false);
        }

 

        運行,測試OK:
  
 
        總結:
        對於簡單的控制邏輯來說,硬編碼的方式比較適合。
        但對於稍微複雜一些的控制邏輯來說,還是這種方式比較適用。因爲這種方式比較靈活,並且可以直觀的在設計界面上進行修改,代碼也顯得簡潔,可讀性強。
        遺憾的是,菜單項和工具欄項不是可綁定的,所以本文介紹的方式無效。而通常使用中,菜單和工具欄偏偏又是控制邏輯最複雜的。唯一的辦法,只能是自定義一個Actions控件,並採用本文類似的邏輯,通過Reflection機制對菜單項和工具欄進行綁定。Delphi的Actions控件就做的相當不錯。


來源:互連網 作者:沐楓網誌
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章