.NET20 一种简单的窗口控件UI状态控制方法

        我们经常需要控制窗口控件的状态。比如,在某些情况下,需要禁止一部份控件,或让一部份控件呈只读状态等等。
        假如有如下的窗口:
       

        当按下Enable时,左侧的所有控件都要禁止(Enabled=false),当按下Disable时,左侧的所有控件都取消禁止(Enabled=true)。
        通常的作法是直接用代码来控制:    

None.gif          private   void  EnableOrDisable( bool  isEnabled)
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif {
InBlock.gif            
this.button1.Enabled = isEnabled;
InBlock.gif            
this.checkBox1.Enabled = isEnabled;
InBlock.gif            
this.comboBox1.Enabled = isEnabled;
InBlock.gif            
this.textBox1.Enabled = isEnabled;
ExpandedBlockEnd.gif        }

None.gif
None.gif        
private   void  btnEnable_Click( object  sender, EventArgs e)
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif {
InBlock.gif            EnableOrDisable(
true);
ExpandedBlockEnd.gif        }

None.gif
None.gif        
private   void  btnDisable_Click( object  sender, EventArgs e)
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif {
InBlock.gif            EnableOrDisable(
false);
ExpandedBlockEnd.gif        }


        这样的作法,在一些简单的逻辑控制倒也行的通。但是一旦控件的数量比较多,而控制逻辑也比较复杂的时候,类似EnableOrDisable的函数将会变得很多,而且很复杂、不直观。
        本文介绍一种方法,可以在RAD可视化设计界面中直接指定控件的状态,并只用很简单的代码来切换状态。

.NET20 一种简单的窗口控件UI状态控制方法    沐枫网志

        首先,定义一个类UiState,类中只有一个属性“IsEnabled”,用于指定当前控件的禁止状态:

None.gif      class  UiState
ExpandedBlockStart.gifContractedBlock.gif    
dot.gif {
InBlock.gif        
private bool isEnabled;
InBlock.gif
InBlock.gif        
public bool IsEnabled
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif            
get dot.gifreturn isEnabled; }
ExpandedSubBlockStart.gifContractedSubBlock.gif            
set dot.gif{ isEnabled = value; }
ExpandedSubBlockEnd.gif        }
 
ExpandedBlockEnd.gif    }

None.gif
None.gif


        然后编译。必须编译一次,否则RAD界面不知道有这个类存在。
        接下来,到DataSources侧栏中点“增加新数据源”,并在向导中选择“Object”,按下一步:

 

        选择“UiState”,按“Finish”:

 

        再回到窗口的设计界面,依次设置需要改变状态的控件。
        如下图,选中某个控件,到属性页中,展开(DataBindings),启动(Advanced)设置窗口,选择“Enabled”属性,并在Binding中选择“uiStateBindingSource - IsEnabled”。
 

        如下图,可以在设计窗口检查绑定状态:

 

        最后增加Enable和Disable按钮的处理函数: 

None.gif          private  UiState uiState  =   new  UiState();
None.gif
None.gif        
public  Form1()   //  构造函数
ExpandedBlockStart.gifContractedBlock.gif
         dot.gif {
InBlock.gif            InitializeComponent();
InBlock.gif            uiStateBindingSource.DataSource 
= uiState; // 必须!!!
ExpandedBlockEnd.gif        }

None.gif
None.gif        
private   void  EnableOrDisable( bool  state)
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif {
InBlock.gif            uiState.IsEnabled 
= state;
InBlock.gif            uiStateBindingSource.ResetCurrentItem();
ExpandedBlockEnd.gif        }

None.gif        
private   void  btnEnable_Click( object  sender, EventArgs e)
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif {
InBlock.gif            EnableOrDisable(
true);
ExpandedBlockEnd.gif        }

None.gif
None.gif        
private   void  btnDisable_Click( object  sender, EventArgs e)
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif {
InBlock.gif            EnableOrDisable(
false);
ExpandedBlockEnd.gif        }

 

        运行,测试OK:
  
 
        总结:
        对于简单的控制逻辑来说,硬编码的方式比较适合。
        但对于稍微复杂一些的控制逻辑来说,还是这种方式比较适用。因为这种方式比较灵活,并且可以直观的在设计界面上进行修改,代码也显得简洁,可读性强。
        遗憾的是,菜单项和工具栏项不是可绑定的,所以本文介绍的方式无效。而通常使用中,菜单和工具栏偏偏又是控制逻辑最复杂的。唯一的办法,只能是自定义一个Actions控件,并采用本文类似的逻辑,通过Reflection机制对菜单项和工具栏进行绑定。Delphi的Actions控件就做的相当不错。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值