- publicclassButton:ButtonBase
- {
- //依赖属性
- publicstaticreadonlyDependencyPropertyIsDefaultProperty;
- staticButton()
- {
- //注册属性
- Button.IsDefaultProperty=DependencyProperty.Register("IsDefault",
- typeof(bool),typeof(Button),
- newFrameworkPropertyMetadata(false,
- newPropertyChangedCallback(OnIsDefaultChanged)));
- ……
- }
- //.net属性包装器(可选)
- publicboolIsDefalut
- {
- get{return(bool)GetValue(Button.IsDefaultProperty);}
- set{SetValue(Button.IsDefaultProperty,value);}
- }
- //属性改变的回调(可选)
- privatestaticvoidOnIsDefaultChanged(DependencyObjectobj,DependencyPropertyChangedEventArgse)
- {
- ……
- }
- }
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设置属性。
附加属性:
附加属性能够启用一些我们所盼望的属性值(被添加的元素并没有该属性值)继承特性,是依赖属性的一种特殊形式,可以被有效地添加到任何对象中。
- <StackPanelTextElement.FontSize="30"TextElement.FontStyle="Italic"
- Orientation="Horizontal"HorizontalAlignment="Center">
- <ButtonMinWidth="75"Margin="10">Help</Button>
- <ButtonMinWidth="75"Margin="10">OK</Button>
- </StackPanel>