2. 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( 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 } 注意第四行,这句可以保证是的我改变的设置仅仅是当前对象的设置。而不是全局的。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |