WPF 依赖属性 附加属性定义及属性
依赖属性
1、是不具有数据绑定,动画,样式控件支持上述特性(自定义控件支持数据绑定,动画等)。
2、依赖属性和CLR属性在内存的使用上是截然不同的,每个CLR属性都包含一个非static的字段,因此当我们实例化一个类型的时候,就会创建该类型所拥有的所有CLR属性,也就是说一个对象所占用的内存在调用new操作进行实例化的时候就已经决定了、而wpf允许对象在创建的时候并不包含用于存储数据的空间,只保留在需要用到数据的时候能够获得该默认值,即用其他对象数据或者实时分配空间的能力。
3、无论什么时候,只要依赖属性的值发生改变,wpf就会自动根据属性的元数据触发一系列的动作,这些动作可以重新呈现UI元素,也可以更新当前的布局,刷新数据绑定等等,这种变更的通知最有趣的特点之一就是属性触发器,它可以在属性值改变的时候,执行一系列自定义的动作,而不需要更改任何其他的代码来实现。通过下面的示例来演示属性变更通知(Trigger)
<Window.Resources> <Style x:Key="btnStyle" TargetType="Button"> <Setter Property="Height" Value="50"/> <Setter Property="Width" Value="50"/> <Style.Triggers> <Trigger Property="IsMouseOver" Value="True"> <Setter Property="Foreground" Value="Red"/> </Trigger> </Style.Triggers> </Style> </Window.Resources> <Grid> <Button Style="{StaticResource btnStyle}" Content="Test 依赖项属性"/> </Grid>
在样式中设置当鼠标滑过时 修改按钮文字颜色。
定义依赖性属性
快捷键 propdp(依赖项属性)/propa(附加属性) 按两侧Tab键可快速根据代码块生成属性
附加属性
1、常见附加属性:用于非定义该属性的类 例如Grid面板的RowDefinition、ColumnDefinition、Canvas面板的Left、Right
DockPanel面板的Dock都是附加属性
2、自定义附加属性
public class PassWordDP { public static string GetPwd(DependencyObject obj) { return (string)obj.GetValue(PwdProperty); } public static void SetPwd(DependencyObject obj, string value) { obj.SetValue(PwdProperty, value); } public static readonly DependencyProperty PwdProperty = DependencyProperty.RegisterAttached("Pwd", typeof(string), typeof(PassWordDP), new PropertyMetadata(null, (d, e) => { var pwdText = d as PasswordBox; if (pwdText != null) { pwdText.PasswordChanged -= PwdText_PasswordChanged; pwdText.Password = e.NewValue.ToString(); pwdText.PasswordChanged += PwdText_PasswordChanged; } })); private static void PwdText_PasswordChanged(object sender, RoutedEventArgs e) { var pas = sender as PasswordBox; var word = pas.Password; SetPwd(pas, word); } }
public MainWindow() { InitializeComponent(); Pwd = "12444"; DataContext = this; } private string pwd; public string Pwd { get => pwd; set { if (pwd != value) { pwd = value; PassWordDP.SetPwd(this.pwdbox, pwd); } } } private void Button_Click(object sender, RoutedEventArgs e) { Pwd = "11111111111111111"; }
<PasswordBox Grid.Row="1" Name="pwdbox" local:PassWordDP.Pwd="{Binding Pwd, Mode=TwoWay}" />
//双向绑定没有实现MVVM, 在优化