依赖属性

  圣殿骑士更新了博客.第七章主要是讲的"依赖属性".

所以自己看书也了解下这个属性!依赖属性对于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");
}

 

posted @ 2010-08-30 11:00  ~@@~  阅读(1064)  评论(0编辑  收藏  举报