34.Silverlight中不得不了解使用的依赖属性
2011-04-07 14:26
465 查看
Silverlight中我们经常使用自定义控件,并且在自定义控件中制作自定义属性,在项目中大量的创建这个自定义控件,每次都需要占用内存来创建这个 属性的默认值。可很多时候我们都只需要去使用这个属性的默认值就可以,并不用每次都使用这个属性。所以在Silverlight和WPF中引入了依赖属性 这个概念,以节约内存并且可以灵活的使用属性。
首先我们了解一下Silverlight中有3种属性的创建方式:一、CLR自定义属性。二、依赖属性。三、附加属性。
一、下面我们来看一下CLR自定义属性的创建方式如下,相信大家都创建过:
二、依赖属性是存储于基类DependencyObject中的一个键值配对字典中的。它并没有存储在所属的类中,所以不会每次都去重新创建一个属性默认值占用内存。下面我们来看看创建一个依赖属性的代码如下:
注意在OnXChanged(DependencyObject d,DependencyPropertyChangedEventArgs e)函数中处理在依赖属性变化时进行的操作。在本例中改变rectangle1矩形框的位置。注册好了依赖属性之后我们可以通过XAML方式和CS代码方 式来控制自定义控件类的依赖属性分别如下:
XAML方式控制依赖属性:
CS代码控制依赖属性:
下面我们看注册依赖属性的Register函数的相关参数以及用法:
三、附加属性是一种特殊的依赖属性,是全局依赖属性,它的注册方式是DependencyProperty.RegisterAttached();参数和依赖属性的注册参数相同。
下面我们来看本实例中的完整的XAML代码和XAML.CS代码如下:
Rectan.xaml.cs
Rectan.xaml
MainPage.xaml.cs
MainPage.xaml
本实例采用VS2010+Silverlight 4.0编写,如需源码请点击 SLDependencyProp.rar 下载。
首先我们了解一下Silverlight中有3种属性的创建方式:一、CLR自定义属性。二、依赖属性。三、附加属性。
一、下面我们来看一下CLR自定义属性的创建方式如下,相信大家都创建过:
private string _RectWidth; public string RectWidth { get { return _RectWidth; } set { _RectWidth = value; } }
二、依赖属性是存储于基类DependencyObject中的一个键值配对字典中的。它并没有存储在所属的类中,所以不会每次都去重新创建一个属性默认值占用内存。下面我们来看看创建一个依赖属性的代码如下:
#region 设置一个X坐标属性 public double X { get { return (double)GetValue(XProperty); } set { SetValue(XProperty, value); } } // 创建一个名为X的依赖属性,并且设置这个依赖属性X变化的时候,让rectangle1控件位置也变化。 public static readonly DependencyProperty XProperty = DependencyProperty.Register("X", typeof(double), typeof(Rectan), new PropertyMetadata(OnXChanged)); private static void OnXChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { Rectan rec = d as Rectan; rec.rectangle1.SetValue(Canvas.LeftProperty, e.NewValue); } #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代码控制依赖属性:
this.Ikd.SetValue(Rectan.XProperty, 150.0); this.Ikd.SetValue(Rectan.YProperty, 150.0); 在这里主要是通过DependencyProperty.Register(string name, Type propertyType, Type ownerType, PropertyMetadata typeMetadata);函数注册依赖属性的。在OnXChanged()函数中我们可以处理当属性值变化的时候需要进行的逻辑操作。 // 摘要: // 使用属性的指定属性名称、属性类型、所有者类型和属性元数据注册依赖项属性。 // 参数: // name: // 要注册的依赖项对象的名称。 // propertyType: // 属性的类型。 // ownerType: // 正注册依赖项对象的所有者类型。 // typeMetadata: // 属性元数据实例。实例中可以包含一个 System.Windows.PropertyChangedCallback 实现引用。 // 返回结果: // 一个依赖项对象标识符,应使用它在您的类中设置 public static readonly 字段的值。随后可以在您自己的代码以及任何第三方用户代码中使用该标识符在将来引用该依赖项属性,用于某些操作,比如以编程方式设置该属性的值,或是在代码中附加 // System.Windows.Data.Binding。 public static DependencyProperty Register(string name, Type propertyType, Type ownerType, PropertyMetadata typeMetadata);
下面我们看注册依赖属性的Register函数的相关参数以及用法:
三、附加属性是一种特殊的依赖属性,是全局依赖属性,它的注册方式是DependencyProperty.RegisterAttached();参数和依赖属性的注册参数相同。
下面我们来看本实例中的完整的XAML代码和XAML.CS代码如下:
Rectan.xaml.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
namespace SLDependencyProp
{
public partial class Rectan : UserControl
{
public Rectan()
{
InitializeComponent();
}
private string _RectWidth; public string RectWidth { get { return _RectWidth; } set { _RectWidth = value; } }
#region 设置一个X坐标属性 public double X { get { return (double)GetValue(XProperty); } set { SetValue(XProperty, value); } } // 创建一个名为X的依赖属性,并且设置这个依赖属性X变化的时候,让rectangle1控件位置也变化。 public static readonly DependencyProperty XProperty = DependencyProperty.Register("X", typeof(double), typeof(Rectan), new PropertyMetadata(OnXChanged)); private static void OnXChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { Rectan rec = d as Rectan; rec.rectangle1.SetValue(Canvas.LeftProperty, e.NewValue); } #endregion
#region 设置一个Y坐标属性
public double Y
{
get { return (double)GetValue(YProperty); }
set { SetValue(YProperty, value); }
}
// 创建一个名为X的依赖属性,并且设置这个依赖属性X变化的时候,让rectangle1控件位置也变化。
public static readonly DependencyProperty YProperty =
DependencyProperty.Register("Y", typeof(double), typeof(Rectan), new PropertyMetadata(OnYChanged));
private static void OnYChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
Rectan rec = d as Rectan;
rec.rectangle1.SetValue(Canvas.TopProperty, e.NewValue);
}
#endregion
}
}
Rectan.xaml
<UserControl x:Class="SLDependencyProp.Rectan" 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" mc:Ignorable="d" d:DesignHeight="45" d:DesignWidth="105"> <Canvas x:Name="LayoutRoot" Background="White"> <Rectangle Height="45" HorizontalAlignment="Left" RadiusX="15" RadiusY="15" Fill="BurlyWood" Name="rectangle1" Stroke="Black" StrokeThickness="1" VerticalAlignment="Top" Width="105" /> </Canvas> </UserControl>
MainPage.xaml.cs
using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Windows; using System.Windows.Controls; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Animation; using System.Windows.Shapes; namespace SLDependencyProp { public partial class MainPage : UserControl { public MainPage() { InitializeComponent(); this.Ikd.SetValue(Rectan.XProperty, 150.0); this.Ikd.SetValue(Rectan.YProperty, 150.0); } } }
MainPage.xaml
<UserControl x:Class="SLDependencyProp.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:uc="clr-namespace:SLDependencyProp" mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="400"> <Grid x:Name="LayoutRoot" Background="White"> <uc:Rectan X="15" Y="105" x:Name="Uil" Width="105" Height="45" HorizontalAlignment="Left" VerticalAlignment="Top"></uc:Rectan> <uc:Rectan x:Name="Ikd" Width="105" Height="45" HorizontalAlignment="Left" VerticalAlignment="Top"></uc:Rectan> <uc:Rectan Width="105" Height="45" HorizontalAlignment="Left" VerticalAlignment="Top"></uc:Rectan> </Grid> </UserControl>
本实例采用VS2010+Silverlight 4.0编写,如需源码请点击 SLDependencyProp.rar 下载。
相关文章推荐
- Silverlight实用窍门系列:34.Silverlight中不得不了解使用的依赖属性【附带源码实例】
- Android中常常使用shape来定义控件的一些显示属性,今天看了一些shape的使用,对shape有了大体的了解,稍作总结: 先看下面的代码: <shape>
- [UWP]了解模板化控件(6):使用附加属性
- Spring4深入理解IOC&DI02----Bean配置--自动装配、bean之间的继承与依赖、使用外部属性文件
- [UWP]依赖属性2:使用依赖属性
- WPF 依赖属性使用
- 使用GetValueSource方法获取依赖属性的源
- CSS中不为人知Zoom属性的使用介绍(IE浏览器不得不说的坑)
- spring ioc容器注入的集中方式,以及属性注入的集中依赖,继承,使用SPEL表达式,ioc容器的生命周期,bean的几种工厂方法配置方式,bean的自动装配
- WPF 依赖属性的创建与使用
- [UWP]依赖属性2:使用依赖属性
- 使用非依赖属性实现同步
- ADO.NET .net core2.0添加json文件并转化成类注入控制器使用 简单了解 iTextSharp实现HTML to PDF ASP.NET MVC 中 Autofac依赖注入DI 控制反转IOC 了解一下 C# AutoMapper 了解一下
- [UWP]依赖属性2:使用依赖属性
- [UWP]依赖属性2:使用依赖属性
- [原创]java WEB学习笔记99:Spring学习---Spring Bean配置:自动装配,配置bean之间的关系(继承/依赖),bean的作用域(singleton,prototype,web环境作用域),使用外部属性文件
- WPF 使用依赖属性(DependencyProperty) 定义用户控件中的Image Source属性
- Android简单了解自定义控件和自定义属性如何使用
- Spring第六弹—-依赖注入之使用构造器注入与使用属性setter方法注入