這一節大家共同學習下用戶控件的自定義的復雜的屬性設置我們這裡自定義一個用戶控件和自定義一個屬性
本節重點:
怎樣定義復雜屬性
復雜屬性和基本類型相互轉換
第一步 先來自定義一個類代碼如下
/// <summary>
/// 自定義屬性類
/// </summary>
public class CustomAttri
{
public CustomAttri(int width int height)
{
_width = width;
_height = height;
}
public CustomAttri()
{
}
private int _width;
private int _height;
/// <summary>
/// 寬度
/// </summary>
public int Width
{
get
{ return _width; }
set
{
_width = value;
}
}
/// <summary>
/// 高度
/// </summary>
public int Height
{
get
{
return _height;
}
set
{
_height = value;
}
}
}
然後自定義一個控件並且定義一屬性SecondSize代碼如下
public partial class UCPanel : Control
{
public UCPanel()
{
InitializeComponent();
}
private CustomAttri _sSize=new CustomAttri();;
/// <summary>
/// 定義自定義屬性
/// </summary>
[Description(第二尺寸)]
[Category(尺寸)]
public CustomAttri SecondSize
{
get
{
return _sSize;
}
set
{
_sSize=value;
}
}
}
此時編譯項目然後把用戶控件拖到窗體上就可以在屬性設計器中看到此屬性但是此時屬性是只讀的不能設置值
效果圖如下
接下來我們實現讓用戶可以自己設置屬性的值並把用戶輸入的值進行轉換
如果想要把用戶輸入的值轉換為我們自定義的類型需要繼承TypeConverter 類並實現其方法
轉換器代碼如下:
/// <summary>
/// 自定義類型轉換器
/// </summary>
public class CustomAttriConverter:TypeConverter
{
/// <summary>
/// 表示是否允許將給定類型的對象轉換為自定義類型
/// </summary>
/// <param name=context>當前上下文對象</param>
/// <param name=sourceType>給定的類型</param>
/// <returns></returns>
public override bool CanConvertFrom(ITypeDescriptorContext context Type sourceType)
{
//如果給定的類型為字符串可以轉換為自定義類型
if (sourceType==typeof(string))
{
return true;
}
return baseCanConvertFrom(context sourceType);
}
/// <summary>
/// 表示是否允許將自定義類型轉換為指定的類型
/// </summary>
/// <param name=context>當前上下文</param>
/// <param name=destinationType>指定的類型</param>
/// <returns></returns>
public override bool CanConvertTo(ITypeDescriptorContext context Type destinationType)
{
//如果目標類型是字符串允許將自定義類型轉換為字符串
if (destinationType==typeof(string))
{
return true;
}
return baseCanConvertTo(context destinationType);
}
/// <summary>
/// 將指定類型轉換為自定義類型
/// </summary>
/// <param name=context>當前上下文信息</param>
/// <param name=culture>區域信息</param>
/// <param name=value>指定類型</param>
/// <returns></returns>
public override object ConvertFrom(ITypeDescriptorContext context SystemGlobalizationCultureInfo culture object value)
{
if (value is string)
{
string[] sizeArr = ((string)value)Split();//將輸入的字符串以逗號進行分割
CustomAttri ca = new CustomAttri();
caWidth=ConvertToInt(sizeArr[]);
caHeight=ConvertToInt(sizeArr[]);
return ca;
}
return baseConvertFrom(context culture value);
}
/// <summary>
/// 將自定義類型轉換為指定類型
/// </summary>
/// <param name=context>當前上下文</param>
/// <param name=culture>區域</param>
/// <param name=value></param>
/// <param name=destinationType>指定類型</param>
/// <returns></returns>
public override object ConvertTo(ITypeDescriptorContext context SystemGlobalizationCultureInfo culture object value Type destinationType)
{
//如果要轉換為自定義類型
if (destinationType==typeof(string))
{
if (value is CustomAttri)
{
CustomAttri ca = (CustomAttri)value;
return caWidthToString() + + caHeightToString();
}
}
return baseConvertTo(context culture value destinationType);
}
}
然後把該轉換器標記在自定義屬性上這樣在窗體上就可以為該用戶控件的屬性設置值了
[Description(第二尺寸)]
[Category(尺寸)]
[TypeConverter(typeof(CustomAttriConverter))]
public CustomAttri SecondSize
{
get
{
return _sSize;
}
set
{
_sSize=value;
}
}
效果圖:
子屬性的實現
上面代碼雖然實現了可以給自定義屬性設置值但是字屬性不能顯示出來如果想實現把子屬性顯示出來需要重載以下方法
/// <summary>
/// 返回此對象是否支持屬性
/// </summary>
/// <param name=context></param>
/// <returns></returns>
public override bool GetPropertiesSupported(ITypeDescriptorContext context)
{
return true;
}
public override PropertyDescriptorCollection GetProperties(ITypeDescriptorContext context object value Attribute[] attributes)
{
//return baseGetProperties(context value attributes);
return TypeDescriptorGetProperties(typeof(CustomAttri) attributes);
}
效果圖
至此復雜自定義屬性的設置我們已經講解完成
From:http://tw.wingwit.com/Article/program/net/201311/13986.html