Silverlight中我们经常使用自定义控件,并且在自定义控件中制作自定义属性,在项目中大量的创建这个自定义控件,每次都需要占用内存来创建这个 属性的默认值。可很多时候我们都只需要去使用这个属性的默认值就可以,并不用每次都使用这个属性。所以在Silverlight和WPF中引入了依赖属性 这个概念,以节约内存并且可以灵活的使用属性。

首先我们了解一下Silverlight中有3种属性的创建方式:一、CLR自定义属性。二、依赖属性。三、附加属性。

一、下面我们来看一下CLR自定义属性的创建方式如下,相信大家都创建过:

  1. private string _RectWidth;
  2. public string RectWidth
  3. {
  4. get { return _RectWidth; }
  5. set { _RectWidth = value; }
  6. }

二、依赖属性是存储于基类DependencyObject中的一个键值配对字典中的。它并没有存储在所属的类中,所以不会每次都去重新创建一个属性默认值占用内存。下面我们来看看创建一个依赖属性的代码如下:

  1. #region 设置一个X坐标属性
  2. public double X
  3. {
  4. get { return (double)GetValue(XProperty); }
  5. set { SetValue(XProperty, value); }
  6. }
  7. // 创建一个名为X的依赖属性,并且设置这个依赖属性X变化的时候,让rectangle1控件位置也变化。
  8. public static readonly DependencyProperty XProperty =
  9. DependencyProperty.Register("X", typeof(double), typeof(Rectan), new PropertyMetadata(OnXChanged));
  10. private static void OnXChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
  11. {
  12. Rectan rec = d as Rectan;
  13. rec.rectangle1.SetValue(Canvas.LeftProperty, e.NewValue);
  14. }
  15. #endregion

注意在OnXChanged(DependencyObject d,DependencyPropertyChangedEventArgs e)函数中处理在依赖属性变化时进行的操作。在本例中改变rectangle1矩形框的位置。注册好了依赖属性之后我们可以通过XAML方式和CS代码方 式来控制自定义控件类的依赖属性分别如下:

XAML方式控制依赖属性:

<uc:Rectan X="15" Y="105" x:Name="Uil" Width="105" Height="45" HorizontalAlignment="Left" VerticalAlignment="Top"></uc:Rectan>

CS代码控制依赖属性:

  1. this.Ikd.SetValue(Rectan.XProperty, 150.0);
  2. this.Ikd.SetValue(Rectan.YProperty, 150.0);
  3. 在这里主要是通过DependencyProperty.Register(string name, Type propertyType, Type ownerType, PropertyMetadata typeMetadata);函数注册依赖属性的。在OnXChanged()函数中我们可以处理当属性值变化的时候需要进行的逻辑操作。
  4. // 摘要:
  5. // 使用属性的指定属性名称、属性类型、所有者类型和属性元数据注册依赖项属性。
  6. // 参数:
  7. // name:
  8. // 要注册的依赖项对象的名称。
  9. // propertyType:
  10. // 属性的类型。
  11. // ownerType:
  12. // 正注册依赖项对象的所有者类型。
  13. // typeMetadata:
  14. // 属性元数据实例。实例中可以包含一个 System.Windows.PropertyChangedCallback 实现引用。
  15. // 返回结果:
  16. // 一个依赖项对象标识符,应使用它在您的类中设置 public static readonly 字段的值。随后可以在您自己的代码以及任何第三方用户代码中使用该标识符在将来引用该依赖项属性,用于某些操作,比如以编程方式设置该属性的值,或是在代码中附加
  17. // System.Windows.Data.Binding。
  18. public static DependencyProperty Register(string name, Type propertyType, Type ownerType, PropertyMetadata typeMetadata);

下面我们看注册依赖属性的Register函数的相关参数以及用法:

三、附加属性是一种特殊的依赖属性,是全局依赖属性,它的注册方式是DependencyProperty.RegisterAttached();参数和依赖属性的注册参数相同。

下面我们来看本实例中的完整的XAML代码和XAML.CS代码如下:

Rectan.xaml.cs
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Net;
  5. using System.Windows;
  6. using System.Windows.Controls;
  7. using System.Windows.Documents;
  8. using System.Windows.Input;
  9. using System.Windows.Media;
  10. using System.Windows.Media.Animation;
  11. using System.Windows.Shapes;
  12. namespace SLDependencyProp
  13. {
  14. public partial class Rectan : UserControl
  15. {
  16. public Rectan()
  17. {
  18. InitializeComponent();
  19. }
  20. private string _RectWidth;
  21. public string RectWidth
  22. {
  23. get { return _RectWidth; }
  24. set { _RectWidth = value; }
  25. }
  26. #region 设置一个X坐标属性
  27. public double X
  28. {
  29. get { return (double)GetValue(XProperty); }
  30. set { SetValue(XProperty, value); }
  31. }
  32. // 创建一个名为X的依赖属性,并且设置这个依赖属性X变化的时候,让rectangle1控件位置也变化。
  33. public static readonly DependencyProperty XProperty =
  34. DependencyProperty.Register("X", typeof(double), typeof(Rectan), new PropertyMetadata(OnXChanged));
  35. private static void OnXChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
  36. {
  37. Rectan rec = d as Rectan;
  38. rec.rectangle1.SetValue(Canvas.LeftProperty, e.NewValue);
  39. }
  40. #endregion
  41. #region 设置一个Y坐标属性
  42. public double Y
  43. {
  44. get { return (double)GetValue(YProperty); }
  45. set { SetValue(YProperty, value); }
  46. }
  47. // 创建一个名为X的依赖属性,并且设置这个依赖属性X变化的时候,让rectangle1控件位置也变化。
  48. public static readonly DependencyProperty YProperty =
  49. DependencyProperty.Register("Y", typeof(double), typeof(Rectan), new PropertyMetadata(OnYChanged));
  50. private static void OnYChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
  51. {
  52. Rectan rec = d as Rectan;
  53. rec.rectangle1.SetValue(Canvas.TopProperty, e.NewValue);
  54. }
  55. #endregion
  56. }
  57. }
Rectan.xaml
  1. <UserControl x:Class="SLDependencyProp.Rectan"
  2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  5. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  6. mc:Ignorable="d"
  7. d:DesignHeight="45" d:DesignWidth="105">
  8. <Canvas x:Name="LayoutRoot" Background="White">
  9. <Rectangle Height="45" HorizontalAlignment="Left" RadiusX="15" RadiusY="15" Fill="BurlyWood" Name="rectangle1" Stroke="Black" StrokeThickness="1" VerticalAlignment="Top" Width="105" />
  10. </Canvas>
  11. </UserControl>
MainPage.xaml.cs
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Net;
  5. using System.Windows;
  6. using System.Windows.Controls;
  7. using System.Windows.Documents;
  8. using System.Windows.Input;
  9. using System.Windows.Media;
  10. using System.Windows.Media.Animation;
  11. using System.Windows.Shapes;
  12. namespace SLDependencyProp
  13. {
  14. public partial class MainPage : UserControl
  15. {
  16. public MainPage()
  17. {
  18. InitializeComponent();
  19. this.Ikd.SetValue(Rectan.XProperty, 150.0);
  20. this.Ikd.SetValue(Rectan.YProperty, 150.0);
  21. }
  22. }
  23. }
MainPage.xaml
  1. <UserControl x:Class="SLDependencyProp.MainPage"
  2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  5. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  6. xmlns:uc="clr-namespace:SLDependencyProp"
  7. mc:Ignorable="d"
  8. d:DesignHeight="300" d:DesignWidth="400">
  9. <Grid x:Name="LayoutRoot" Background="White">
  10. <uc:Rectan X="15" Y="105" x:Name="Uil" Width="105" Height="45" HorizontalAlignment="Left" VerticalAlignment="Top"></uc:Rectan>
  11. <uc:Rectan x:Name="Ikd" Width="105" Height="45" HorizontalAlignment="Left" VerticalAlignment="Top"></uc:Rectan>
  12. <uc:Rectan Width="105" Height="45" HorizontalAlignment="Left" VerticalAlignment="Top"></uc:Rectan>
  13. </Grid>
  14. </UserControl>

本实例采用VS2010+Silverlight 4.0编写,如需源码请点击 SLDependencyProp.rar 下载。

转载于:https://blog.51cto.com/chengxingliang/822564

34.Silverlight中不得不了解使用的依赖属性相关推荐

  1. WCF 中序列化自定义依赖属性类

    众所周知.NetFramework中存在着两种依赖属性,他们也分别集成着不同但名称相同的依赖对象: System.Windows.DependencyProperty:System.Windows.D ...

  2. Silverlight实用窍门系列:56.Silverlight中的Binding使用(一)【附带实例源码】

    本文将详细讲述Silverlight中Binding,包括Binding的属性和用法,Binding的数据流向. Binding:一个完整的Binding过程是让源对象中的某个属性值通过一定流向规则进 ...

  3. WPF基础到企业应用系列8——依赖属性之“风云再起”

    一. 摘要 首先圣殿骑士很高兴"WPF 基础到企业应用系列" 能得到大家的关注.支持和认可.看到很多朋友留言希望加快速度的问题,我会尽力的,对你们的热情关注也表示由衷的感谢.这段时 ...

  4. WPF快速入门系列(2)——深入解析依赖属性

    一.引言 感觉最近都颓废了,好久没有学习写博文了,出于负罪感,今天强烈逼迫自己开始更新WPF系列.尽管最近看到一篇WPF技术是否老矣的文章,但是还是不能阻止我系统学习WPF.今天继续分享WPF中一个最 ...

  5. WPF的依赖属性和附加属性(用法解释较全)

    转:https://www.cnblogs.com/zhili/p/WPFDependencyProperty.html 一.引言 感觉最近都颓废了,好久没有学习写博文了,出于负罪感,今天强烈逼迫自己 ...

  6. 初步了解WPF依赖属性

    一 依赖属性 在WPF库实现中,依赖属性使用普通的C#属性进行了包装,使得我们可以通过和以前一样的方式来使用依赖属性.但必须明确,在WPF中我们大多数都在使用依赖属性,而不是使用属性.依赖属性重要性在 ...

  7. WPF xaml中列表依赖属性的定义

    原文:WPF xaml中列表依赖属性的定义 列表内容属性 如上图,是一个列表标题排序控件,我们需要定义一个标题列表,从而让调用方可以自由的设置标题信息. 在自定义控件时,会遇到列表依赖属性,那么该如何 ...

  8. Silverlight实用窍门系列:47.Silverlight中元素到元素的绑定,以及ObservableCollection和List的使用区别...

    问题一:在某一些情况下,我们使用MVVM模式的时候,对于某一个字段(AgeField)需要在前台的很多个控件(A.B.C.D.E)进行绑定,但是如何能够让我们后台字段名改变的时候能够非常方便的改变所有 ...

  9. Silverlight中服务通信方式的选择(WCF、Data Service、Ria Service)

    Silverlight中服务通信方式的选择(WCF.Data Service.Ria Service) 转自 http://www.cnblogs.com/024hi/archive/2011/06/ ...

最新文章

  1. 关于学外语,这些人人都知道的“常识”,可能是错的……
  2. 德州阿尔法计算机技术有限公司,德州扑克被人工智能完美攻陷 为什么比阿尔法狗还值得关注?...
  3. 如何设置mysql的权限_mysql 权限控制
  4. dokuwiki mysql_dokuwiki安装和使用总结 (windows安装版本)
  5. android 如何保留数据两位小数
  6. 浅尝boost之timer
  7. golang channel的一些总结
  8. python等待用户输入指定秒_如何在10秒后强制用户输入
  9. Xcode6中Swift没有智能提示和自动补全功能
  10. jdbc编程遇到文件上传
  11. windows中文件夹打包成Jar包 cmd命令
  12. sata接口 图解 定义_SATA数据和电源接口定义详解
  13. JNPF 3.1升3.2新版本内,拉姆达表达式内时间比较
  14. 汽车智能化的商业化路径、产业演进及投资机会探讨——附下载链接
  15. python快速生成文字云_在Python中创建文字云或标签云
  16. C#取得DataTable最大值、最小值
  17. pycharm如何恢复工具的主菜单
  18. Java网络编程之实现资源下载详解【王道Java】
  19. 快来看啊,2023成都Java培训机构排行榜出来啦!
  20. Django配置163邮箱出现 authentication failed(535)错误解决方法

热门文章

  1. 列车时刻管理c语言程序设计,列车时刻表信息管理系统实践报告C语言源代码
  2. flask使用第三方云通讯平台时,出现{'172001':'网络错误'}解决方法
  3. uboot kernel 博客
  4. 题目1452:搬寝室(dp题目)
  5. 深入剖析Redis RDN持久化机制
  6. Struts 2 Spring Hibernate三大框架的执行流程以及原理
  7. HDU 1542 Atlantis 线段树+离散化+扫描线
  8. c++ 类的sizeof
  9. DML,DDL,DCL,DQL的区别
  10. 去年下半年blog文章导入完毕