Silverlight:Dependency Property(依赖属性)学习笔记

1.定义依赖属性

 

        #region Text
        public static readonly DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(string), typeof(ImageButton), new PropertyMetadata(default(string), new PropertyChangedCallback(TextPropertyChanged)));
        public string Text
        {
            get { return base.GetValue(TextProperty) as String; }
            set
            {
                base.SetValue(TextProperty, value);
                this.textBlockContent.Text = value;
            }
        }

        static void TextPropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
        {
            var imageButton = (ImageButton)sender;
            var val = (string)e.NewValue;
            imageButton.Text = val;
        }
        #endregion

!!!!注意:属性的命名和依赖属性的命名必须是 依赖属性名=属性名+Property

不然出现下面第2点所说问题。回调事件命名则不作特定 要求。。。

2.在使用资源字典Style设定Dependency Property(依赖属性) 的值:

出现问题: 未将对象引用设置到对象的实例。

解决方法:参考第1点中的注意事项即可。

 

3.参考网络资料 http://www.cnblogs.com/cm490893449/articles/1883830.html

学习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

作者:菩提树下的杨过
出处:http://yjmyzz.cnblogs.com 
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

 
 

 

时间: 2024-08-25 15:49:10

Silverlight:Dependency Property(依赖属性)学习笔记的相关文章

明晰Silverlight中的依赖属性

在c#中--得益于c#3.0中的自动属性--我们可以十分轻松的通过如下代码创建一个叫做 "AuthorName"的属性. public string AuthorName { get; set; } 上面的代码就是我们熟悉的CLR属性,我们可以很方便的读/取这个属性的值.不过在 silverlight的世界中如果你想做更多更牛的事情,CLR属性就显得有些力不从心了.它们包 括--动画.数据绑定.样式/模板等等. 因此,微软在WPF中提出了依赖属性(Dependency Property

Javascript依赖注入学习笔记

注意:不要将依赖注入和设计模式里的依赖倒置原则(Dependency Inversion Principle)混淆. 目标 设想我们有两个模块.第一个是负责Ajax请求服务(service),第二个是路由(router). var service = function() {      return { name: 'Service' }; } var router = function() {      return { name: 'Router' }; } //我们有另一个函数需要用到这两

Ember.js 计算的属性学习笔记

例子:  代码如下 复制代码 App.Person = Ember.Object.extend({   id: null,   firstName: null,   lastName: null,   age: null,   gender: null }); 在 handlebars 模板里使用: 我的名字叫{{firstName}}{{lastName}},{{gender}}性,今年{{age}}岁. 假定我还想根据 age 的值来划分「幼年」.「少年」.「青年」.「壮年」.「老年」又如何

silverlight:wcf双工通讯学习笔记

一直觉得SL中的wcf双工通讯方式有点鸡肋,如果是以http方式实现则效率太低,如果用SL4中的tcp方式实现,又跟socket太雷同,所以一直没去研究,不过这东西在对性能要求不高时(比如在网页上每5分钟更新一次天气预报/股票信息),实现起来还是蛮方便的. wcf双工通讯与传统的wcf相比,最大的区别就是:传统的wcf通常都是客户端去调服务,即客户端从服务端上"拉"信息,而双工通讯除了允许客户端从服务端"拉"信息外,服务端还能主动向客户端"推"送

Silverlight的依赖属性与附加属性

好久没写Silverlight了,依赖属性(Dependency Property)和附加属性 (Attached Property)这两个算是很基础的知识都不是很记得了.写一写,当做 一下笔记吧. CLR属性 与 依赖属性 CLR属性我们非常熟悉了,在DotNet编程中随处可见.最简单最常见的属性访 问器就是直接操纵类的私有成员,如下: public class Person { private String _name; public string Name { get { return _

深入剖析依赖属性(WPF/Silverlight核心)(上)

一. 摘要 前几篇我们讲了WPF的一些基本知识,但是始终没有接触最核心的概念,那么从这篇文章开始的下面几篇文 章中,我们会分别深入讨论一下依赖属性.路由事件.命令和绑定等相关概念,希望这几篇文章对大家能有所 帮助.由于自己才疏学浅且是对这些技术的使用总结和心得体会,错误之处在所难免,怀着技术交流的心态, 在这里发表出来,所以也希望大家能够多多指点,这样在使一部分人受益的同时也能纠正我的错误观点,以便 和各位共同提高. 二. 本文提纲 · 1.摘要 · 2.本文提纲 · 3.比这篇文章更重要的东西

WPF基础到企业应用系列7深入剖析依赖属性(WPF/Silverlight核心)

一. 摘要 首先圣殿骑士很高兴这个系列能得到大家的关注和支持,这个系列从七月份开始到现在才第七篇,上一篇发布是在8月2日,掐指一算有二十多天没有继续更新了,最主要原因一来是想把它写好,二来是因为最近几个月在筹备"云计算之旅"系列,所以一再推迟了发布进度.之前一直都没有想过要录制视频,主要的原因还是怕自己知识有限,从而误导他人,所以前几次浪曦和51CTO邀请录制视频,我都以工作忙.公司内部培训需要时间和自己有待提高等理由委婉的拒绝了,说实在的,自己也知道自己还有很多地方有待提高,还需要向

WPF and Silverlight学习笔记(十三):依赖项属性和路由事件

一.依赖项属性(Dependency Property) Windows Presentation Foundation (WPF) 提供了一组服务,这些服务可用于扩展公共语言运行时 (CLR) 属性的功能.这些服务通常统称为 WPF 属性系统.由 WPF 属性系统支持 的属性称为依赖项属性.本概述介绍 WPF 属性系统以及依赖项属性的功能,这 包括如何在可扩展应用程序标记语言 (XAML) 中和代码中使用现有的依赖项属性 . 依赖项属性的用途在于提供一种方法来基于其他输入的值计算属性值 .这些

WPF + Silverlight学习笔记

WPF and Silverlight学习笔记(三十):Brush(2) WPF and Silverlight学习笔记(二十九):Brush(1) WPF and Silverlight学习笔记(二十八):基本图形的使用(3)图 WPF and Silverlight学习笔记(二十七):基本图形的使用(2)Pa WPF and Silverlight学习笔记(二十六):基本图形使用(1) WPF and Silverlight学习笔记(二十五) WPF and Silverlight学习笔记(