2. WPF中的依赖属性

来源:互联网 发布:mac 修复flash player 编辑:程序博客网 时间:2024/05/08 14:13

昨天学习了下WPF的以来属性,记录下自己的理解。

我们一般给一个类设置一个属性很简单,但是如果给一个控件设置一个属性,会比较麻烦。

比如说,自己做一个button控件,继承自button

 1     class MyButton : Button 2     { 3          4         private Color _backColor; 5         public Color BackColor 6         { 7             get 8             { 9                 return _backColor;10             }11             set12             {13                 _backColor = value;14                 this.Background = new SolidColorBrush() { Color = _backColor };15             }16         }17     }

这个属性目的是设置按钮的背景色。这没有什么问题,但是在设置样式的时候会出问题。

1     <phone:PhoneApplicationPage.Resources>2         <Color x:Key="MyForceColor">Red</Color>3         <Color x:Key="MyBackColor">White</Color>4         <Style x:Name="mystyle" TargetType="PhoneApp3:MyButton">5             <Setter Property="BackColor" Value="Red"/>6         </Style>

 这个时候会出现编译错误,意思就是说不能够在style里面直接设置自定义属性。

如果想在style里面配置那么就需要使用以来属性。

 1     public class MyButton : Button 2     { 3         public static readonly DependencyProperty ForceColorProperty = 4             DependencyProperty.Register("ForceColor", 5             typeof(Color), 6             typeof(MyButton), 7             new PropertyMetadata(Colors.Black, OnColorChanged)); 8  9         public static readonly DependencyProperty BackColorProperty =10             DependencyProperty.Register("BackColor",11             typeof(Color),12             typeof(MyButton),13             new PropertyMetadata(Colors.White, OnColorChanged));14 15         public Color ForceColor16         {17             set { SetValue(ForceColorProperty, value); }18             get { return (Color)GetValue(ForceColorProperty); }19         }20         public Color BackColor21         {22             set { SetValue(BackColorProperty, value); }23             get { return (Color)GetValue(BackColorProperty); }24         }25 26         static void OnColorChanged(DependencyObject obj,27             DependencyPropertyChangedEventArgs args)28         {29             var btn = obj as MyButton;30             if (args.Property == ForceColorProperty)31             {32                 btn.Foreground = new SolidColorBrush() { Color = (Color)args.NewValue };33             }34             if (args.Property == BackColorProperty)35             {36                 btn.Background = new SolidColorBrush() { Color = (Color)args.NewValue };37             }38         }39 40 41 42         43 44     }

 

很坑爹啊,有木有,很复杂啊,有不有,这他妈谁能记得住啊。

不过微软给了一个快捷键来方便的生成模版,只要你输入”prodp“,然后连续按两次tab键,就可以自动生成一个模版。

1         public int MyProperty2         {3             get { return (int)GetValue(MyPropertyProperty); }4             set { SetValue(MyPropertyProperty, value); }5         }6 7         // Using a DependencyProperty as the backing store for MyProperty.  This enables animation, styling, binding, etc...8         public static readonly DependencyProperty MyPropertyProperty =9             DependencyProperty.Register("MyProperty", typeof(int), typeof(ownerclass), new PropertyMetadata(0));

我们可以来看看注册函数

DependencyProperty.Register(
"MyProperty", -- 名字
typeof(int), --该属性的类型
typeof(ownerclass), --该属性所属类的类型
new PropertyMetadata(0));--属性变化以后的处理

明白意思了也不是很复杂了,不过要记住处理函数的格式

  static void OnColorChanged(DependencyObject obj,DependencyPropertyChangedEventArgs args)

而且别忘了要是静态的。

 最后还有一点,因为属性是静态的,也就是说它是全局一份的,所以在处理的时候要很小心。

 1         static void OnColorChanged(DependencyObject obj, 2             DependencyPropertyChangedEventArgs args) 3         { 4             var btn = obj as MyButton; 5             if (args.Property == ForceColorProperty) 6             { 7                 btn.Foreground = new SolidColorBrush() { Color = (Color)args.NewValue }; 8             } 9             if (args.Property == BackColorProperty)10             {11                 btn.Background = new SolidColorBrush() { Color = (Color)args.NewValue };12             }13         }

注意第四行,这句可以保证是的我改变的设置仅仅是当前对象的设置。而不是全局的。