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, 在优化

 

posted @ 2021-11-09 15:49  吃葡萄不吐葡萄脾  阅读(348)  评论(0编辑  收藏  举报