WPF:依赖属性和附加属性示例

来源:互联网 发布:芜湖淘宝主播招聘 编辑:程序博客网 时间:2024/05/21 17:18
  1. public class Button : ButtonBase  
  2. {  
  3.     // 依赖属性  
  4.     public static readonly DependencyProperty IsDefaultProperty;  
  5.   
  6.     static Button()  
  7.     {  
  8.        // 注册属性  
  9.         Button.IsDefaultProperty = DependencyProperty.Register("IsDefault",  
  10.             typeof(bool), typeof(Button),  
  11.             new FrameworkPropertyMetadata(false,  
  12.                 new PropertyChangedCallback(OnIsDefaultChanged)));  
  13.         ……  
  14.     }  
  15.   
  16.     // .net属性包装器(可选)  
  17.     public bool IsDefalut  
  18.     {  
  19.         get { return (bool)GetValue(Button.IsDefaultProperty); }  
  20.         set { SetValue(Button.IsDefaultProperty, value); }  
  21.     }  
  22.   
  23.     // 属性改变的回调(可选)  
  24.     private static void OnIsDefaultChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)  
  25.     {  
  26.         ……  
  27.     }  
  28. }  


    IsDefaultProperty静态成员是真正的依赖属性,类型为System.Windows.DependencyProperty。按规则,所有的DependencyProperty成员都必须是public、static,并且有一个Property作为后缀。依赖属性通常是通过调用DependencyProperty.Register静态方法创建的,这样的方法需要一个名称(IsDefault)、一个属性类型(bool)以及拥有这个属性的类(Button类)。。通过不同的Register方法重载,你可以传入metadata(元数据)来告诉WPF如何处理该属性、如何处理属性值改变的回调、如何处理强制值转,以及如何验证值。Button会在它的静态构造函数中调用Register的重载,给依赖属性一个默认值false,并为变更通知添加一个委托。

    最后,那个叫作IsDefault的传统.NET属性会调用继承自System.Windows.Dependency-Object的GetValue和SetValue方法来实现自己的访问器,System.Windows.DependencyObject是底层基类,这是拥有依赖属性的类必须继承的。GetValue返回最后一次由SetValue设置的值,如果SetValue从未被调用过,那么就是该属性注册时的默认值。IsDefault .NET属性(有时叫作此上下文中的属性包装器)并不是必需的,Button的使用者可能会直接调用GetValue/ SetValue方法,因为它们是公开的。但是.NET属性会让以编程方式读写属性变得更加自然,它还允许通过XAML设置属性。


附加属性:

附加属性能够启用一些我们所盼望的属性值(被添加的元素并没有该属性值)继承特性,是依赖属性的一种特殊形式,可以被有效地添加到任何对象中。

[html] view plaincopy
  1. <StackPanel TextElement.FontSize="30" TextElement.FontStyle="Italic"  
  2.             Orientation="Horizontal" HorizontalAlignment="Center">  
  3.             <Button MinWidth="75" Margin="10">Help</Button>  
  4.             <Button MinWidth="75" Margin="10">OK</Button>  
  5.         </StackPanel>  
上例中,因为StackPanel自己没有任何与字体相关的属性。相反,你必须使用FontSize和FontStyle附加属性,这是在一个叫作TextElement的类中定义的。这样,在StackPanel中的两个子元素button都继承了相应的字体与格式,
0 0
原创粉丝点击