您的位置:首页 > 其它

精通Silverlight——12.5.3 定义控件属性

2008-04-24 17:58 232 查看

  在开始添加属性和行为之前应该理解,定义用户UI的XAML文件将作为程序集的资源嵌入到程序集中。因此为了能够引用XAML中定义的对象,必须在类的构造函数中添加一些代码,通常分为如下四步。
q 获取当前程序集的实例。
q 从程序集中获取资源文件流。
q 将流转换为字符串类型。
q 使用Control类的 InitializeFromXaml 实例化XAML中定义的可视化树。
在MyLabel控件中,相应的程序代码如下所示:
public class MyLabel : Control
{
//implementationRoot相当于根画布
FrameworkElement implementationRoot;
//Xaml文件中定义的TextBlock
TextBlock tb;
public MyLabel()
{
//获取当前程序集实例
Assembly asm = this.GetType().Assembly;
//获取程序集的资源清单,注意xaml的命名。
Stream s = asm.GetManifestResourceStream("mySampleControls.MyLabel.xaml");
//调用InitializeFromXaml初始化控件树。
implementationRoot = this.InitializeFromXaml(new StreamReader(s).ReadToEnd());
//获取在Xaml中定义的TextBlock控件
tb = implementationRoot.FindName("tb") as TextBlock;
//定义加载事件
this.Loaded += new EventHandler(MyLabel_Loaded);
//指定宽和高
base.Width = implementationRoot.Width;
base.Height = implementationRoot.Height;
}
……
VS2008会为用户控件项目自动添加如下的代码,完成与上面代码相同的工作。
public MyLabel()
{
System.IO.Stream s = this.GetType().Assembly.GetManifestResourceStream("mySampleControls.MyLabel.xaml");
this.InitializeFromXaml(new System.IO.StreamReader(s).ReadToEnd());
}
默认情况下,控件并不具有任何属性。通过在类中添加公共属性定义,就能在XAML和代码文件中使用控件的属性了,MyLabel控件定义了四个属性,代码如下所示:
//定义控件的宽度
public virtual new double Width
{
get
{
return implementationRoot.Width;
}
set
{
implementationRoot.Width = value;
UpdateLayout();
}
}
//定义控件的高度
public virtual new double Height
{
get
{
return implementationRoot.Height;
}
set
{
implementationRoot.Height = value;
UpdateLayout();
}
}
//定义控件的文本设置属性
public String Text
{
get
{
return tb.Text;
}
set
{
tb.Text = value;
UpdateLayout();
}
}
//定义控件的颜色
public SolidColorBrush LabelColor
{
get
{
return (SolidColorBrush)tb.Foreground;
}
set
{
tb.Foreground = (SolidColorBrush)value;
}
}
protected void UpdateLayout()
{
tb.SetValue(Canvas.LeftProperty, (Width - tb.ActualWidth) / 2);
tb.SetValue(Canvas.TopProperty, (Height - tb.ActualHeight) / 2);
}
注意这里使用了new关键字定义控件的Width和Height属性,C#中的new关键字用于隐藏基类的定义。由于Control也具有Width和Height属性,但是这两个属性与控件的实际的宽度和高度并不具有任何的关联。这两个属性非常重要,读者在创建用户控件时应该使用new关键字隐藏Control类的Width和Height。
Width和Height的设置和设置值都被转换为画布的高度和宽度,用户控件本身也可以看作是一个组合控件的容器,类似于ASP.NET中的用户控件一样。最后属性的set语法中调用了UpdateLayout事件,用于当属性值更改后自动更新控件的布局。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: