zoukankan      html  css  js  c++  java
  • WPF依赖属性-依赖属性介绍

    WPF的设计理念是:数据驱动,UI与逻辑松耦合

    一、传统的CLR属性
    public class Person
    {
        private string _Name;
        public string Name
        {
            get
            {
                 return _Name;
             }
             set
             {
                _Name = value;
             }
         }
     }
    
    二、CLR属性特点:
    • CLR属性,是实例属性;
    • 在多级继承的情况下,孙孙辈对象占用内存空间不可避免的膨胀;
    三、依赖属性
    // 1. 使类型继承DependencyObject类
        public class Person : DependencyObject
        {
            // 2. 声明一个静态只读的DependencyProperty 字段
            public static readonly DependencyProperty nameProperty;
            static Person()
            {
                // 3. 注册定义的依赖属性
                nameProperty = DependencyProperty.Register("Name", typeof(string), typeof(Person), 
                    new PropertyMetadata("Learning Hard",OnValueChanged)); 
            }
            // 4. 属性包装器,通过它来读取和设置我们刚才注册的依赖属性
            public string Name
            {
                get { return (string)GetValue(nameProperty); }
                set { SetValue(nameProperty, value); }
            }
            private static void OnValueChanged(DependencyObject dpobj, DependencyPropertyChangedEventArgs e)
            {
                // 当只发生改变时回调的方法
            }
        }
    
    四、依赖属性的特点

    1、依赖属性声明为:类的静态只读对象;
    2、依赖属性是通过DependencyObject注册的属性;
    3、依赖属性读取是通过DependencyObject的方法读取;
    4、类的依赖属性只有一份,且由DependecyObject维护。
    5、多级继承,且大多数字段值不改变的情况下,减少内存占比
     DependencyProperty将一个对象依赖属性存储在一个全局的Hashtable中;通过依赖对象(DependencyObject)的GetValue和SetValue存取数据;
    6、 依赖属性值可以通过Binding依赖于其它对象上,这就使得数据源一变动;依赖于此数据源的依赖属性全部进行更新

    五、依赖属性特性应用

    1、依赖属性(值传递)继承
    中逻辑树上实际父级变动,在子级没有显式指定值时,默认采用父级的值
     如下图中:窗体上所有的字体都变大(从20变成了50),并不需要通过设置每个控件的属性;只需要设置窗体的属性,这个窗体的子控件就会适应这一改变,并且使用相同的设置
    在这里插入图片描述

    <Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      Title="WPF Example" SizeToContent="WidthAndHeight"
      FontSize="50" FontStyle="Italic"
      Background="Blue">
        <StackPanel>
            <Label FontWeight="Bold" FontSize="20" Foreground="White">
                Hi There!
            </Label>
            <Label>2015 Solidmango</Label>
            <ListBox>
                <ListBoxItem>Item1</ListBoxItem>
                <ListBoxItem>Item2</ListBoxItem>
            </ListBox>
            <StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
                <Button MinWidth="75" Margin="10">Help</Button>
                <Button MinWidth="75" Margin="10">OK</Button>
            </StackPanel>
            <StatusBar>Solidmango</StatusBar>
        </StackPanel>
    </Window>
    

    2、属性的改变通知
    CLR属性只有通过事件响应函数或者回调函数来传递属性性改变; 依赖属性只需配置就可以(见第三部分的示例)

    更详细的介绍参见依赖属性的传递

    五、依赖属性的优先级

    在这里插入图片描述

  • 相关阅读:
    SwiftUI:看我展示52张扑克牌,“很快啊!”
    不会吧,这也行?iOS后台锁屏监听摇一摇
    分布式锁
    布隆过滤器原理
    redis缓存穿透
    布隆过滤器应用DEMO
    线程的声明周期
    分布式事务
    滑动窗口协议
    代理
  • 原文地址:https://www.cnblogs.com/MonoHZ/p/14944137.html
Copyright © 2011-2022 走看看