(四)附加属性

来源:互联网 发布:办公软件培训班多少钱 编辑:程序博客网 时间:2024/05/20 18:00

附加属性

  • 附加属性的含义是:一个属性本来不属于某个对象,因为某种原因需求而被附加上。
  • 就是把一个对象放入某一个特定的环境后,对象才具有的属性。

举个例子:

假设我们有一个人的类People,它有可能在与学校相关的工作中用到(记录学号,专业,班级)
它也有可能在与公司相关的工作中用到(部门,项目),所以我们在定义People类时不应该包含class,id等等,这些应该放在School这些类里,因为id,class等是学校附加给People的。

在WPF中我们在布局中都用到了附加属性,比如:

<Canvas Margin="10"><Button ... Canvas.Top="0"/><Button ... Canvas.Top="30"/></Canvas>

显然Button里并没有Top,Left等属性,这些属性是容器给附加上的。当你把控件放在Grid里就让Grid给它附上Column和Row属性,放在Canvas里,Canvas就为它附上Top,Left属性,放在DockPanel里就让DockPanel为它附上Dock属性。

附加属性的定义

我们下面用上面所说的People类为例:

 public class School:DependencyObject    {        //附加属性的包装器与依赖属性不同依赖属性使用属性CLR属性封装。        //附加属性使用两个方法进行分装。        public static int GetMyProperty(DependencyObject obj)        {            return (int)obj.GetValue(GradeProperty);        }        public static void SetMyProperty(DependencyObject obj, int value)        {            obj.SetValue(GradeProperty, value);        }        //与依赖属性的注册不同 附加属性使用RegisterAttached         public static readonly DependencyProperty GradeProperty =            DependencyProperty.RegisterAttached("GradeProperty", typeof(int), typeof(School), new PropertyMetadata(0));    }

使用附加属性

继续上面的例子:

class People:DependencyObject //依赖对象{}//使用People p = new People();School.SetGrade(p,6); //设置int grade = School.GetGrade(p);//获取

在上面的依赖属性的值被保存在People的实例p中的EffectiveVAlueEntry数组中。

附加属性的Binding

<Canvas>    <Slider x:Name="sliderX" Canvas.Top="10" Canvas.Left="10" Width="260" Maximum="200" Minimum="50"></Slider>    <Slider x:Name="sliderY" Canvas.Top="40" Canvas.Left="10" Width="260" Maximum="200" Minimum="50"></Slider>    <Rectangle x:Name="rect" Fill="blue" Width="30" Height="30"        Canvas.Left="{Binding ElementName=sliderX,Path=Value}"        Canvas.Top="{Binding ElementName=sliderY,Path=Value}"></Rectangle>    <Ellipse x:Name="elli" Width="30" Height="30" Fill="red"></Ellipse></Canvas>

对应的后台代码:

 public MainWindow()//窗口构造函数    {        InitializeComponent();        elli.SetBinding(Canvas.LeftProperty, new Binding("Value") { Source = sliderY });        elli.SetBinding(Canvas.TopProperty, new Binding("Value") { Source = sliderX });    }

在上面的例子中我们整个窗体用Canvas布局,用两个Slider控制矩形和圆在Canvas中的横纵坐标。其中矩形在XAML中Binding,圆在c#代码中。如上代码。下面是效果演示图:
这里写图片描述

原创粉丝点击