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

  • 相关阅读:
    jsp 特殊标签
    poj 1753 Flip Game 高斯消元 异或方程组 求最值
    zoj 3155 Street Lamp 高斯消元 异或方程组 求方案数
    poj1222 EXTENDED LIGHTS OUT 高斯消元解异或方程组 模板
    zoj 3930 Dice Notation 模拟
    zoj 3157 Weapon 线段树求逆序对数
    hdu 1242 Rescue BFS+优先队列
    hdu 3466 Proud Merchants 贪心+01背包
    zoj 3689 Digging 贪心+01背包
    hdu 2602 Bone Collector 01背包模板
  • 原文地址:https://www.cnblogs.com/houzf/p/15529337.html
Copyright © 2011-2022 走看看