WPF中的依赖属性

昨天学习了下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             set

12             {

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 ForceColor

16         {

17             set { SetValue(ForceColorProperty, value); }

18             get { return (Color)GetValue(ForceColorProperty); }

19         }

20         public Color BackColor

21         {

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 MyProperty

2         {

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         }

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

 

 

你可能感兴趣的:(WPF)