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),并不需要通过设置每个控件的属性;只需要设置窗体的属性,这个窗体的子控件就会适应这一改变,并且使用相同的设置
WPF依赖属性-依赖属性介绍_第1张图片

<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 SolidmangoLabel>
        <ListBox>
            <ListBoxItem>Item1ListBoxItem>
            <ListBoxItem>Item2ListBoxItem>
        ListBox>
        <StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
            <Button MinWidth="75" Margin="10">HelpButton>
            <Button MinWidth="75" Margin="10">OKButton>
        StackPanel>
        <StatusBar>SolidmangoStatusBar>
    StackPanel>
Window>

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

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

五、依赖属性的优先级

WPF依赖属性-依赖属性介绍_第2张图片
参考文档
WPF快速入门系列(2)——深入解析依赖属性

一站式WPF–依赖属性(DependencyProperty)

你可能感兴趣的:(C#,WPF,wpf,c#)