学习SL/WPF,Dependency Properties(依赖属性)是一个全新(陌生)但又无法回避的概念。
http://www.wpftutorial.net/DependencyProperties.html 这里有一篇通俗易懂的相关文章,不过是E文的,E文不好的朋友,也可以参考下面的内容:
1.为什么会出现依赖属性?
先回想一下传统的属性(Property):通常我们读取或赋值一个属性时,实际上是在对属性背后的某个私有成员进行读写。那么随着对象的属性越来越多,再加上从对象派生出去的子对象,子对象再生出“孙子”对象......最终的对象运行实例中会有大量的私有成员,而每私有成员都要分配内存,占用一定的资源。
但反过来想想,通常我们在使用一个控件/对象时,往往只用到了某几个属性,大部分属性(有时候甚至达到90%以上)都是采用的默认值(或者也可以理解为没有用到),这对于WPF/SL来说无疑是一种极大的性能损耗。
所以在此背景之下,DP(Dependency Properties的简称)就出现了,我们再回想一下静态(static)方法或成员,静态成员/方法的调用不依赖于实例,它是class级别的,不管这个类有多少个实例,静态成员在内存中只占一份,这正是我们所要的!
2.依赖属性的大致原理及好处
所有具备依赖属性的对象,都是继承自DependencyObject,DependencyObject中有一个"字典"存储区用来存放依赖属性,而且都是用static方式读取的,所以你现在应该想明白了:为啥不能直接用txt.Left = xxx来直接赋值,而必须用txt.SetValue(Canvas.Left,xxx)来处理,因为static成员是实例无法调用的。
DP的优点:
(1)有效降低内存消耗。
(2)直接继承上级的属性值(这里也解释了为什么上级控件对下级控件自动布局,因为下级控件自动继承了上级控件的相关属性值)
(3)自动实现了“变化通知”(dp有内置的Change Notification回调接口)
3.依赖属性值的读取策略
这张图描述了GetValue与SetValue的内部读取策略.
4.依赖属性的使用示例:
下面我们演示如何给一个用户自定义控件添加Message依赖属性
(1)先建一个Silverlight User Control,取名为MyControl
xaml部分:

代码

<UserControl x:Class="DPStudy.MyControl"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    >
    <Border CornerRadius="5" BorderThickness="3" BorderBrush="#FFEF410D" Width="300" Height="40" Margin="5"  >        
        <TextBlock x:Name="txt" Text="" VerticalAlignment="Center" HorizontalAlignment="Center"></TextBlock>
    </Border>
</UserControl>

CS部分:(技巧:vs2008中,只要键入propdp,再连敲二次Tab键,vs就会自动添加一个依赖属性的代码模板)

代码

using System.Windows;
using System.Windows.Controls;

namespace DPStudy
{
    public partial class MyControl : UserControl
    {
            
        
        public static readonly DependencyProperty MessageProperty = DependencyProperty.Register("Message", typeof(string), typeof(MyControl), new PropertyMetadata("Message的默认值", new PropertyChangedCallback(OnMessagePropertyChanged)));

public string Message
        {
            get { return (string)GetValue(MessageProperty); }
            set { SetValue(MessageProperty, value); }
        }

/// <summary>
        /// Message变化时的通知处理
        /// </summary>
        /// <param name="d"></param>
        /// <param name="e"></param>
        private static void OnMessagePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            MyControl ctl = d as MyControl;
            ctl.txt.Text = d.GetValue(MyControl.MessageProperty).ToString();
        }

public MyControl()
        {
            InitializeComponent();

this.Loaded += new RoutedEventHandler(MyControl_Loaded);
        }

void MyControl_Loaded(object sender, RoutedEventArgs e)
        {
            this.txt.Text = Message;//初始加载时,显示Message的初始值
        }
    }
}

这里我们定义了一个Message的string类型依赖属性,和普通属性的区别是:必须使用DependencyProperty.Register来注册该属性,而且“属性命名”要以Property为后缀;另外在读取时,必须调用SetValue/GetValue静态方法来读取其值,最后我们还可以添加一个"属性值变化时的"回调处理。

(2)将MyControl放到MainPage.xaml中小试牛刀
MainPage.Xaml内容如下:

代码

<UserControl x:Class="DPStudy.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:l="clr-namespace:DPStudy"
    mc:Ignorable="d" d:DesignWidth="640" d:DesignHeight="480">
  <StackPanel x:Name="LayoutRoot">        
        <l:MyControl x:Name="myctl"></l:MyControl>
        <Button Click="Button_Click" Content="改变Message属性值" Width="130" ></Button>
    </StackPanel>
</UserControl>

MainPage.Xaml.cs内容如下:

代码

using System.Windows;
using System.Windows.Controls;

namespace DPStudy
{
    public partial class MainPage : UserControl
    {
        public MainPage()
        {
            InitializeComponent();            
        }

private void Button_Click(object sender, RoutedEventArgs e)
        {
            myctl.SetValue(MyControl.MessageProperty, "新值");
        }
    }
}

运行后,点击按钮将改变MyControl控件的Message属性值,同时MyControl中的文本控件的文字也将变成"新值"

转载请注明来自菩提树下的杨过

文中源文件代码:DPStudy.rar

转载于:https://www.cnblogs.com/yjmyzz/archive/2009/12/23/1630526.html

Silverlight:Dependency Property(依赖属性)学习笔记相关推荐

  1. 数据库LINQ TO SQL在Silverlight中的应用(WCF)------学习笔记(一)

    数据库LINQ TO SQL在Silverlight中的应用(WCF)------学习笔记(一) 步骤: 1. 创建SILVERLIGHT应用程序 2. 创建LINQ TO SQL [注意序列化的问题 ...

  2. html5 scrollheight,JavaScript之scrollTop、scrollHeight、offsetTop、offsetHeight等属性学习笔记...

    全文参考:https://github.com/iuap-design/blog/issues/38 .MDN clientHeight,只读 clientHeight可以用公式 CSS height ...

  3. html 滚动条 scrolltop scrollheight,JavaScript之scrollTop、scrollHeight、offsetTop、offsetHeight等属性学习笔记...

    全文参考:https://github.com/iuap-design/blog/issues/38 .MDN clientHeight,只读 clientHeight可以用公式 CSS height ...

  4. Maven项目依赖管理 学习笔记

    本学习笔记根据慕课视频[Maven项目依赖管理]摘录,主要学习maven的使用方式,从理念到实践.基础到应用,掌握基于maven管理java项目的方式. 目录 第一章 Maven概述 Maven简介 ...

  5. css flex属性学习笔记

    参考文献 flex: 1 0calc((100% / min(var(--cx-active-view), var(--cx-max-views))) -var(--cx-split-gutter)) ...

  6. Angular 依赖注入学习笔记之工厂函数的用法

    网址:https://angular.institute/di We can transfer any data through our apps, transform it and replace ...

  7. HTML5新增属性学习笔记

    1.form属性 表单内的从属元素,可以写在表单外部.可以通过指定元素的form属性来声明元素所属表单.form的属性值为表单的id. 1 <form id="testForm&quo ...

  8. 常见的CSS字体样式属性/font-size/font-family/font-weight/font-style/font综合属性/@font-face属性/学习笔记

    一.常见的CSS字体样式属性 1.font-size属性:用于设置字体字号 该属性的值有 相对长度单位:em(相对当前对象内文本字体尺寸)px(像素,最常用) 绝对长度单位:in(英寸)cm(厘米)m ...

  9. Vue中scoped属性学习笔记

    #什么是scoped vue中在style标签中的一个属性,使用scoped属性可以使标签内的样式只作用于当前组件中的元素. #scoped的原理 在刚开始使用的时候,页面调试的html标签内和样式中 ...

最新文章

  1. Web 架构师的能力(转)
  2. 测试公众号修改名称_微信公众号开通个人认证,只需三步
  3. C语言 | 编译与预处理指令(宏定义完整讲解:#define)
  4. C#用IrisSkin4.dll 美化Winform窗体
  5. python怎么设置回文数_python如何写一个函数判断回文数?
  6. jquery选择器小知识点们
  7. Maven阿里云镜像配置
  8. .NET之我见系列 - 类型系统(上)
  9. C 中细节问题的试题
  10. Mybatis传递多个参数
  11. linux怎么卸载fishshell,为Bash/Zsh/Fish安装Starship Shell提示符的步骤
  12. 超越QQ Mail文件中转站---大文件上传设计思路和实践 原创 王泽宾
  13. 极化码 极化现象matlab仿真(信道容量,巴氏参数,高斯近似三种方法)
  14. python问题解决:TypeError: ufunc 'add' output (typecode 'O') could not be coerced to provided output para
  15. 黑苹果安装经验整理|再见丁小果
  16. android文件恢复功能,安卓手机误删文件恢复?快速恢复办法
  17. 谁是史上最强-用爬虫分析IMDB TOP250电影数据
  18. 天平游码读数例题_天平游码怎么读数?
  19. 哈密顿插值c语言,哈密顿系统有限元方法的长时间性质研讨——冯康猜想的证明.pdf...
  20. 此IP地址不允许调用接口,如有需要请登录微信支付商户平台更改配置

热门文章

  1. 安装 卸载 mysql linux,Linux 下MySQL 安装与卸载
  2. java两个栈怎么完成初始化_Spring bean初始化及销毁你必须要掌握的回调方法
  3. 如何创建linux 脚本,如何创建和执行shell脚本
  4. 目标检测(六)--SPPNet
  5. linux nvm node 权限不够_centos部署node+mongodb环境
  6. 高中电子技术——三极管的放大特性和开关特性
  7. 简述中断和 DMA 的区别。
  8. 《计算机网络》简要学习笔记:未完自用
  9. 计算机图形学用到哪些概率知识,图形学所需的数学知识
  10. 为什么java IO类不用基于继承的设计方案?