精通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事件,用于当属性值更改后自动更新控件的布局。
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事件,用于当属性值更改后自动更新控件的布局。
相关文章推荐
- 精通Silverlight——12.5.2 定义控件外观
- 代码创建图片轮换; 代码创建控件时,如何将控件定义成属性
- 自定义控件如同系统控件:自定义控件,画空间图片,定义空间属性,构造监听器。
- 精通Silverlight——12.4.4 Thumb按钮控件
- 精通Silverlight——12.5 创建Silverlight用户控件
- 使用shape来定义控件的一些显示属性
- Silverlight dependency property属性的定义
- silverlight .net后台 设置visifire控件图表样式 属性说明
- 浅谈Silverlight2.0 beta1(1) 控件属性中的ContentControl与ContentTemplate
- Android中使用shape来定义控件的一些显示属性
- Android中常常使用shape来定义控件的一些显示属性,今天看了一些shape的使用,对shape有了大体的了解,稍作总结: 先看下面的代码: <shape>
- Silverlight控件自适应利器UseLayoutRounding属性(解决自适应抖动问题)
- Silverlight 用DependencyProperty 自定义ImageButton控件 定义属性
- silverlight为控件注册属性
- Android_declare-styleable_自己定义控件的属性
- 精通Silverlight——12.4.1 Button按钮控件
- 精通Silverlight——12.4.5 按钮控件继承层次结构
- android通过style.xml文件定义相同控件的通用属性
- [Silverlight学习笔记]如何获取ItemsControl的DataTemplate中定义的控件?
- Silverlight 控件中显示图像 Image.Source 属性 需要注意的地方