zoukankan      html  css  js  c++  java
  • 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, 在优化

  • 相关阅读:
    存储过程语法
    ORA-20000:ORU-10027:buffer overflow,limit of 2000 bytes.
    ORACLE 存储过程异常捕获并抛出
    Sqlldr导入txt文件内容到数据库中
    ORA-01589: 要打开数据库则必须使用 RESETLOGS 或 NORESETLOGS 选项
    oracle将一个表中字段的值赋值到另一个表中字段(批量)
    (三)Solr——Solr的基本使用
    (二)Solr——Solr界面介绍
    jrebel 7免费激活(非破解) 和 IntelliJ Idea 2017 免费激活方法
    (一)Solr——简介和安装配置
  • 原文地址:https://www.cnblogs.com/houzf/p/15529337.html
Copyright © 2011-2022 走看看