昨天学习了下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@H_502_112@ MyButton : Button 2 @H_502_112@ { 3 public static readonly DependencyProperty ForceColorProperty = 4 DependencyProperty.Register("ForceColor"@H_502_112@, 5 typeof@H_502_112@(Color), 6 typeof@H_502_112@(MyButton), 7 new@H_502_112@ PropertyMetadata(Colors.Black,OnColorChanged)); 8 9 public static readonly DependencyProperty BackColorProperty = 10 DependencyProperty.Register("BackColor"@H_502_112@,11 typeof@H_502_112@(Color),12 typeof@H_502_112@(MyButton),13 new@H_502_112@ PropertyMetadata(Colors.White,OnColorChanged)); 14 15 public@H_502_112@ Color ForceColor 16 @H_502_112@ { 17 set@H_502_112@ { SetValue(ForceColorProperty,value); } 18 get { return@H_502_112@ (Color)GetValue(ForceColorProperty); } 19 @H_502_112@ } 20 public@H_502_112@ Color BackColor 21 @H_502_112@ { 22 set@H_502_112@ { SetValue(BackColorProperty,value); } 23 get { return@H_502_112@ (Color)GetValue(BackColorProperty); } 24 @H_502_112@ } 25 26 static void@H_502_112@ OnColorChanged(DependencyObject obj,27 @H_502_112@ DependencyPropertyChangedEventArgs args) 28 @H_502_112@ { 29 var btn = obj as@H_502_112@ MyButton; 30 if (args.Property ==@H_502_112@ ForceColorProperty) 31 @H_502_112@ { 32 btn.Foreground = new SolidColorBrush() { Color =@H_502_112@ (Color)args.NewValue }; 33 @H_502_112@ } 34 if (args.Property ==@H_502_112@ BackColorProperty) 35 @H_502_112@ { 36 btn.Background = new SolidColorBrush() { Color =@H_502_112@ (Color)args.NewValue }; 37 @H_502_112@ } 38 @H_502_112@ } 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(@H_735_404@0));
DependencyProperty.Register(
"MyProperty",-- 名字
typeof(int),--该属性的类型
typeof(ownerclass),--该属性所属类的类型
new PropertyMetadata(0));--属性变化以后的处理
明白意思了也不是很复杂了,不过要记住处理函数的格式
static void OnColorChanged(DependencyObject obj,DependencyPropertyChangedEventArgs args)
而且别忘了要是静态的。
最后还有一点,因为属性是静态的,也就是说它是全局一份的,所以在处理的时候要很小心。
1 static void@H_502_112@ OnColorChanged(DependencyObject obj, 2 @H_502_112@ DependencyPropertyChangedEventArgs args) 3 @H_502_112@ { 4 var btn = obj as@H_502_112@ MyButton; 5 if (args.Property ==@H_502_112@ ForceColorProperty) 6 @H_502_112@ { 7 btn.Foreground = new SolidColorBrush() { Color =@H_502_112@ (Color)args.NewValue }; 8 @H_502_112@ } 9 if (args.Property ==@H_502_112@ BackColorProperty) 10 @H_502_112@ { 11 btn.Background = new SolidColorBrush() { Color =@H_502_112@ (Color)args.NewValue }; 12 @H_502_112@ } 13 }
注意第四行,这句可以保证是的我改变的设置仅仅是当前对象的设置。而不是全局的。
原文链接:https://www.f2er.com/javaschema/286471.html