快捷搜索:

SilverLight 学习笔记--建立Silverlight自定义控件(4)

下面我们来以一个MyText属性为例演示若何创建一个自定义属性,这个例子仍将会用到前面的内容。首先我们要为DependencyObject的属性声明一个公有的DependencyProperty,这个属性是静态的,可以用于数据绑定,声明代码:

public static DependencyProperty TextProperty;

静态属性在静态构造函数中初始化,先看代码:

static SimpleButton()

{

TextProperty = DependencyProperty.Register("MyText",

typeof(string),

typeof(SimpleButton),

new PropertyMetadata("默认值", new PropertyChangedCallback(SimpleButton.OnTextPropertyChanged)));

}

DependencyProperty应该由DependencyProperty.Register创建,在MSDN中,这个函数的原型如下:

public static DependencyProperty Register(

string name,

Type propertyType,

Type ownerType,

PropertyMetadata typeMetadata

)

此中name是属性在XAML中应用的名字,propertyType则是属性的类型,留意这个属性理论上可所以任何类型,然则一样平常只应用整数、布尔、字符串、还有UI元素这些类型,其它类型必要定义繁杂的字符串到工具的属性文法作为转换规则(之后可能会单写一篇blog讲converter)。 ownerType便是我们自己定义的类了。typeMetadata有点繁杂,PropertyMetadata构造函数有3个重载,供给选择指定 defaultValue和propertyChangedCallback中随意率性一个或者同时指定2个。原型如下:

public PropertyMetadata

(

Object defaultValue,

PropertyChangedCallback propertyChangedCallback

)

defaultValue是属性的默认值没什么可说,propertyChangedCallback也很简单,便是当属性改变时的处置惩罚函数,这个是把属性同我们的类联系起来的关键了,PropertyChangedCallback 是个委托类型,它的署名也可以在MSDN查到:

public delegate void PropertyChangedCallback

(

DependencyObject d,

DependencyPropertyChangedEventArgs e

)

下面是我们对MyText属性的详细实现:

添加自定义控件属性#region 添加自定义控件属性

public static DependencyProperty TextProperty;

此控件的C#属性#region 此控件的C#属性

public string MyText

{

get

{

return (string)base.GetValue(TextProperty);

}

set

{

base.SetValue(TextProperty, value);

}

}

#endregion

静态构造函数#region  静态构造函数

static MySilverButton()

{

TextProperty = DependencyProperty.Register("MyText",

typeof(string),

typeof(MySilverButton),

new PropertyMetadata("默认属性值", new PropertyChangedCallback(MySilverButton.OnTextPropertyChanged)));

}

#endregion

private static void OnTextPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)

{

(d as MySilverButton).OnTextPropertyChanged(e);

}

void OnTextPropertyChanged(DependencyPropertyChangedEventArgs e)

{

try

{

TextBlock BgTextBlock = this.GetTemplateChild("ButtonCaption") as TextBlock;

BgTextBlock.Text = e.NewValue as string;

}

catch (Exception ex)

{

string ks = ex.ToString();

}

}

#endregion

//有些时刻,我们盼望在模板生效的时刻就对某些模板成员进行操作,如绑定事故,

//调剂属性等,就必要一个事故OnApplyTemplate,我们只能经由过程override父类的OnApplyTemplate来相应模板生效

public override void OnApplyTemplate()

{

base.OnApplyTemplate();

//我们在属性MyText变更的时刻直接GetTemplateChild,并没有斟酌到这时TextBlock是否已经创建,

//在SL中,MyText属性设置着实是发生在Template生效之前的,以是设置MyText的时刻取不到ButtonCaption元素。

//那么,我们就必要斟酌在加载模板完成的时刻,掏出MyText属性并且设置到ButtonCaption上

try

{

var tb = GetTemplateChild("ButtonCaption") as TextBlock;

(GetTemplateChild("ButtonCaption") as TextBlock).Text = this.MyText;

}

catch (Exception ex)

{

string ke = ex.ToString();

}

}

接下来,我们回到MySLbutton项目测试我们新加的属性是否生效。改动Page.xaml文件中的MySilverButton控件属性如下:

此中,MyText便是我们自定义的属性,当我们进行上述改动时,我们可以立即看到显示效果。当然,我们也可以在Page.xaml.cs中对此属性进行动态赋值,代码如下:

this.MyFirstSLbutton.MyText = "动态赋值给自定义属性";

您可能还会对下面的文章感兴趣: