博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
WinForm控件开发总结(十)-----为属性设置默认值
阅读量:6469 次
发布时间:2019-06-23

本文共 2949 字,大约阅读时间需要 9 分钟。

   本系列的前面几篇文章讲解了如何来定义属性以及更有效的编辑属性
,
接下来我要讲一下控件属性的默认值。如果我们希望自己开发的控件更易于被其它开发者使用,那么提供默认值是非常值得的。
      如果你为属性设定了默认值,那么当开发者修改了属性的值,这个值在
Property Explorer
中将会以粗体显示。
VS
为属性提供一个上下文菜单,允许程序员使用控件把值重置为默认值。当
VS
进行控件的串行化时,他会判断那些值不是默认值,只有不是默认值的属性才会被串行化,所以为属性提供默认值时可以大大减少串行化的属性数目,提高效率。
      那么
VS
怎么知道我们的属性值不是默认值了呢?我们需要一种机制来通知
VS
默认值。实现这种机制有两种方法:
      对于简单类型的属性,比如
Int32
Boolean
等等这些
Primitive
类型,你可以在属性的声明前设置一个
DefaultValueAttribute
,在
Attribute
的构造函数里传入默认值。
      对于复杂的类型,比如
Font
Color
,你不能够直接将这些类型的值传递给
Attibute
的构造函数。相反你应该提供
Reset<PropertyName> 
ShouldSerialize<PropertyName>
方法,比如
ResetBackgroundColor(),ShouldSerializeBackgroundColor()
VS
能够根据方法的名称来识别这种方法,比如
Reset<PropertyName>
方法把重置为默认值,
ShouldSerialize<PropertyName>
方法检查属性是否是默认值。过去我们把它称之为魔术命名法,应该说是一种不好的编程习惯,可是现在微软依然使用这种机制。我还是以前面几篇文章使用的例子代码。
      
None.gif
using  System;
None.gif
using  System.Collections.Generic;
None.gif
using  System.Text;
None.gif
using  System.Windows.Forms;
None.gif
using  System.ComponentModel;
None.gif
using  System.Drawing;
None.gif
None.gif
namespace  CustomControlSample
ExpandedBlockStart.gif {
InBlock.gif    
public 
class FirstControl : Control
ExpandedSubBlockStart.gif    {
InBlock.gif
InBlock.gif
private String _displayText=”Hello World!”;
InBlock.gif
private Color _textColor=Color.Red;
InBlock.gif
InBlock.gif  
public FirstControl()
ExpandedSubBlockStart.gif        {
InBlock.gif
ExpandedSubBlockEnd.gif        }
InBlock.gif
InBlock.gif        
//
 ContentAlignment is an enumeration defined in the System.Drawing
InBlock.gif        
//
 namespace that specifies the alignment of content on a drawing 
InBlock.gif        
//
 surface.
InBlock.gif
        
private ContentAlignment alignmentValue = ContentAlignment.MiddleLeft;
InBlock.gif
InBlock.gif        [
InBlock.gif        Category("Alignment"),
InBlock.gif        Description("Specifies the alignment of text.")
InBlock.gif        ]
InBlock.gif        
public ContentAlignment TextAlignment
ExpandedSubBlockStart.gif        {
InBlock.gif
InBlock.gif            
get
ExpandedSubBlockStart.gif            {
InBlock.gif                
return alignmentValue;
ExpandedSubBlockEnd.gif            }
InBlock.gif            
set
ExpandedSubBlockStart.gif            {
InBlock.gif                alignmentValue = value;
InBlock.gif
InBlock.gif                
//
 The Invalidate method invokes the OnPaint method described 
InBlock.gif                
//
 in step 3.
InBlock.gif
                Invalidate();
ExpandedSubBlockEnd.gif            }
ExpandedSubBlockEnd.gif        }
InBlock.gif
InBlock.gif
InBlock.gif [Browsable(
true)]
InBlock.gif [DefaultValue(“Hello World”)]
InBlock.gif 
public String DisplayText
ExpandedSubBlockStart.gif{
InBlock.gif
get
ExpandedSubBlockStart.gif{
InBlock.gif
return _displayText;
ExpandedSubBlockEnd.gif}
InBlock.gif
set
ExpandedSubBlockStart.gif{
InBlock.gif     _displayText =value;
InBlock.gif    Invalidate();
ExpandedSubBlockEnd.gif}
ExpandedSubBlockEnd.gif}
InBlock.gif
InBlock.gif[Browsable(
true)]
InBlock.gif
public Color TextColor
ExpandedSubBlockStart.gif{
InBlock.gif
get
ExpandedSubBlockStart.gif{
InBlock.gif    
return _textColor;
ExpandedSubBlockEnd.gif}
InBlock.gif
set
ExpandedSubBlockStart.gif{
InBlock.gif    _textColor=value;
InBlock.gifInvalidate();
ExpandedSubBlockEnd.gif}
ExpandedSubBlockEnd.gif}
InBlock.gif
InBlock.gif
public 
void ResetTextColor()
ExpandedSubBlockStart.gif{
InBlock.gif    TextColor=Color.Red;
ExpandedSubBlockEnd.gif}
InBlock.gif
InBlock.gif
public 
bool ShouldSerializeTextColor()
ExpandedSubBlockStart.gif{
InBlock.gif
return TextColor!=Color.Red;
ExpandedSubBlockEnd.gif}
InBlock.gif
InBlock.gif
protected 
override 
void OnPaint(PaintEventArgs e)
ExpandedSubBlockStart.gif        {
InBlock.gif            
base.OnPaint(e);
InBlock.gif            StringFormat style = 
new StringFormat();
InBlock.gif            style.Alignment = StringAlignment.Near;
InBlock.gif            
switch (alignmentValue)
ExpandedSubBlockStart.gif            {
InBlock.gif                
case ContentAlignment.MiddleLeft:
InBlock.gif                    style.Alignment = StringAlignment.Near;
InBlock.gif                    
break;
InBlock.gif                
case ContentAlignment.MiddleRight:
InBlock.gif                    style.Alignment = StringAlignment.Far;
InBlock.gif                    
break;
InBlock.gif                
case ContentAlignment.MiddleCenter:
InBlock.gif                    style.Alignment = StringAlignment.Center;
InBlock.gif                    
break;
ExpandedSubBlockEnd.gif            }
InBlock.gif
InBlock.gif            
//
 Call the DrawString method of the System.Drawing class to write   
InBlock.gif            
//
 text. Text and ClientRectangle are properties inherited from
InBlock.gif            
//
 Control.
InBlock.gif
            e.Graphics.DrawString(
InBlock.gif                DisplayText,
InBlock.gif                Font,
InBlock.gif                
new SolidBrush(TextColor),
InBlock.gif                ClientRectangle, style);
InBlock.gif
ExpandedSubBlockEnd.gif        }
ExpandedSubBlockEnd.gif    }
ExpandedBlockEnd.gif}
None.gif

      在上面的代码中,我增加了两个属性,一个是DisplayText,这是一个简单属性,我们只需要在它的声明前添加一个DefaultValue Attribute就可以了。另外一个是TextColor属性,这个复杂类型的属性,所以我们提供了ResetTextColor和ShouldSerializeTextColor来实现默认值。

      默认值的实现就讲完了,但是有一点不要忽视了,你设定了默认值,就应该相应的初始化这些属性,比如我们例子中的代码:

本文转自纶巾客博客园博客,原文链接:http://www.cnblogs.com/guanjinke/archive/2006/12/24/602451.html,如需转载请自行联系原作者
你可能感兴趣的文章
MySQL查看和修改字符集的方法
查看>>
LNMP第二部分nginx、php配置(用户认证、域名重定向、日志、配置缓存、防盗链)...
查看>>
我的友情链接
查看>>
HDU-1878 欧拉回路(并查集,欧拉回路性质)
查看>>
Windows Oracle 11G R2搭建完全指南
查看>>
Unix,BSD,Linux三者有什么区别
查看>>
ACM中java的使用
查看>>
我的友情链接
查看>>
解决JSONObject类找不到的问题
查看>>
CXF3.0.2+Spring3.2.14 Web Service入门实例二
查看>>
利用c语言编写程序输出一个数的每一位(多种方法)
查看>>
GlobalSign 域名型 SSL 证书
查看>>
Linux与云计算——第二阶段Linux服务器架设 第七章:网站WEB服务器架设—用户目录虚拟主机和SSL...
查看>>
关于HTML5你必须知道的28个新特性,新技巧以及新技
查看>>
Java9最新特性有哪些?
查看>>
linux中/etc/passwd和/etc/shadow中各个字段的含义
查看>>
oracle之基本介绍及认证
查看>>
爱创课堂每日一题第十六天为什么HTTPS安全?
查看>>
风险预警·11g容易被忽略的导入性能问题
查看>>
如何找到使用驱动器中的光盘之前需要格式化硬盘的数据
查看>>