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

  在开始添加属性和行为之前应该理解,定义用户UIXAML文件将作为程序集的资源嵌入到程序集中。因此为了能够引用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关键字定义控件的WidthHeight属性,C#中的new关键字用于隐藏基类的定义。由于Control也具有WidthHeight属性,但是这两个属性与控件的实际的宽度和高度并不具有任何的关联。这两个属性非常重要,读者在创建用户控件时应该使用new关键字隐藏Control类的WidthHeight

WidthHeight的设置和设置值都被转换为画布的高度和宽度,用户控件本身也可以看作是一个组合控件的容器,类似于ASP.NET中的用户控件一样。最后属性的set语法中调用了UpdateLayout事件,用于当属性值更改后自动更新控件的布局。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值