圣殿骑士更新了博客.第七章主要是讲的"依赖属性".
所以自己看书也了解下这个属性!依赖属性对于WPF还是非常重要的,学习这段知识的时候,还是应该慢点,细点!
public class Button : ButtonBase { public static readonly DependencyProperty IsDefaultProperty; static Button() { Button.IsDefaultProperty = DependencyProperty.Register("IsDefault", typeof(bool), typeof(Button), new FrameworkPropertyMetadata(false , new PropertyChangedCallback(OnIsDefaultChanged))); } } //.NET属性包装器(可选) public bool IsDefault { get { return (bool)GetValue(Button.IsDefaultProperty); } set { SetValue(Button.IsFocusedProperty, value); } } //属性改变的回调(可选) private static void OnIsDefaultChanged(DependencyObject o,DependencyPropertyChangedEventArgs e) { }
IsDefaultProperty 静态成员是真正的依赖属性,类型System.Windows.DependencyProperty.按规则,所有的DependencyProperty成员必须都是Public、static,并且有一个property作为后缀,依赖属性通常是用过调用DependencyProperty.Register静态方法创建的.这样的方法需要一个名称(IsDefault)、一个属性类型(bool)以及一个拥有这个属性的类(Button 类).通过不同的Register方法重载.你可以传入metadata(元数据)来告诉WPF如何处理该属性、如何处理属性改变的回调、如何处理强制值转换,以及如何验证值. Button毁在他的静态构造函数中调用Register的重载,给依赖属性一个默认值false,并为变更通知添加一个委托.
2.自己写了随便写了一个
<Window x:Class="WpfApplication2.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525" FontSize="30" Foreground="Orange" FontStyle="Italic"> <StackPanel> <Label Background="White" FontSize="20"> 12345566777 </Label> <Label>22222222</Label> <Label>33333333</Label> <ListBox > <ListBoxItem>110</ListBoxItem> <ListBoxItem>120</ListBoxItem> </ListBox> <StackPanel Orientation="Horizontal" HorizontalAlignment="Center" Height="Auto" Width="Auto"> <Button Width="75" Margin="10">OK</Button> <Button Width="75" Margin="10">Cancel</Button> </StackPanel> <StatusBar Height="43">1233131311313</StatusBar> </StackPanel> </Window>
对于大部分元素来说,设置回沿着逻辑数向下传递,并由子元素继承.这甚至会影响Button和LIstboxItem元素,尽管他们位于逻辑树的第三层,第一个Label的FontSize并没有改变,因为它被显示的值为20,重载了继承的值30.而继承后的FontStyle的Italic设置将会影响所有的Label、ListboxItem和Button元素,这是因为他们没有被显式设置过.
注意:虽然StatusBar也像其他空间一样支持着两个属性,但它的文本并没有收到任何值影响.属性值的继承行为时由以下的两种因素决定的:
①并不是每个依赖属性都参与属性值继承的.
②有其他一些优先级更高的源来设置这些属性值
有一些控件如StatusBar、Menu和ToopTip控件,其内部会把字体属性设置为当前的系统设置.通过这种方式.用户可以在控制面板中控制他们的字体....这样的控件会吞噬所有的继承.
3.附加属性
TextElement.FontSize和TextElement.FontStyle(而不是简单的FontSize和FontStyle属性),必须在StackPanel元素中使用.因为StackPanel没有这两个属性.当XAML解析器或者编译器遇到这种语法的时,他就要求TextElement(有时叫做附加属性提供者)有两个状态分别叫做SetFontSize和SetFontyle,这样他们才可以设置相应的属性值.
[转.圣殿骑士]4.依赖属性监听
如果想监听依赖属性的改变,可以用两种方法实现,
①用DependercyProertyDescriptor比较简单,在代码里面写起来也比较便捷;
②用OverrideMatadata的方式主要在自定义控件以及处理一些类间关系的时候;
第一种方法:派生自这个类.然后定义它的属性.重写属性的原数据并传递一个PropertyChangedCallBack参数即可;省略
第二种方法:第二种方法:这个方法更加简单,获取DependencyPropertyDescriptor并调用AddValueChange()为其挂接一个回调函数
private void Window1_Loaded(object sender, RoutedEventArgs e)
{
//第二种方法,通过OverrideMetadata
DependencyPropertyDescriptor descriptor = DependencyPropertyDescriptor.FromProperty(TextBox.TextProperty, typeof(TextBox));
descriptor.AddValueChanged(tbxEditMe, tbxEditMe_TextChanged);
}
private void tbxEditMe_TextChanged(object sender, EventArgs e)
{
MessageBox.Show("", "Changed");
}