silverlight   发布时间:2022-05-04  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Silverlight:Dependency Property(依赖属性)大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

学习SL/WPF,Dependency Properties(依赖属性)是一个全新(陌生)但又无法回避的概念。 http://www.wpftutorial.net/DependencyProperties.html 这里有一篇通俗易懂的相关文章,不过是E文的,E文不好的朋友,也可以参下面的内容: 1.为什么会出现依赖属性? 先回想一下传统的属性(Property):通常我们读取或赋值一个属性时
@H_607_7@


@H_502_13@
学习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.依赖属性值的读取策略

Silverlight:Dependency Property(依赖属性)



这张图描述了GetValue与SETVALue的内部读取策略.

4.依赖属性的使用示例:

下面我们演示如何给一个用户自定义控件添加message依赖属性

(1)先建一个Silverlight User Control,取名为MyControl
xaml部分:

Silverlight:Dependency Property(依赖属性)

代码 @H_607_131@
< UserControl  x:Class ="DPstudy.MyControl"
    xmlns
="http://scheR_476_11845@as.microsoft.com/winfx/2006/xaml/presentation"  
    xmlns:x
="http://scheR_476_11845@as.microsoft.com/winfx/2006/xaml"  
    
>
    
Border  CornerRadius ="5"  BorderThickness ="3"  BorderBrush ="#FFEF410D"  Width ="300"  Height ="40"  Margin            
        
TextBlock  x:Name ="txt"  text =""  VerticalAlignment ="Center"  HorizontalAlignment ="Center" ></ TextBlock </ Border
UserControl >

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

Silverlight:Dependency Property(依赖属性)

代码
using  System.Windows;
 System.Windows.Controls;


namespace  DPstudy
{
    
public   partial class  MyControl : UserControl
    {
            
        
        
static readonly   DependencyProperty messageProperty  =  DependencyProperty.Register( " message " typeof ( String ),0)">(MyControl),255)">new  PropertyMetadata( message的认值  PropertyChangedCallBACk(OnmessagePropertyChanged)));

        
 message
        {
            
get  {  return  ( ) GetValue (messageProperty); }
            
set  {  SETVALue (messageProperty, value); }
        }

        
///   <sumMary>
        
 message变化时的通知处理
        
</sumMary> <param NAME="d"></param> <param NAME="e"></param>
         private void OnmessagePropertyChanged (DependencyObject d, DependencyPropertyChangedEventArgs E)
        {
            MyControl ctl 
=  d  as  MyControl;
            ctl.txt.Text 
 d.GetValue(MyControl.messageProperty).ToString();
        }      


        
 MyControl()
        {
            initializeComponent();

            
this .Loaded  +=  routedEventHandler(MyControl_Loaded);
        }

        
 MyControl_Loaded( object  sender, routedEventArgs E)
        {
            
.txt.Text   message; // 初始加载时,显示message的初始值         }
    }
}

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

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

Silverlight:Dependency Property(依赖属性)

代码
="DPstudy.MainPage"
    xmlns:d
="http://scheR_476_11845@as.microsoft.com/expression/blend/2008"  xmlns:mc ="http://scheR_476_11845@as.openxmlformats.org/markup-compatibility/2006"  
             
xmlns:l ="clr-namespace:DPstudy"
    mc:Ignorable
="d"  d:DesignWidth ="640"  d:DesignHeight ="480"
  
StackPanel  ="LayoutRoot"         
        
< l:MyControl  x:Name ="myctl" ></ l:MyControl
        
Button  Click ="Button_Click"  Content ="改变message属性值" ="130" Button StackPanel 复制代码


MainPage.Xaml.cs内容如下:

Silverlight:Dependency Property(依赖属性)

代码
 System.Windows.Controls;

 MainPage : UserControl
    {
        
 MainPage()
        {
            initializeComponent();            
        }

       
        
 Button_Click( :12px; line-height:1.5; color:rgb(0, routedEventArgs E)
        {
            myctl.SETVALue(MyControl.messageProperty, 
新值 );
        }
    }
}

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

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

文中源文件代码: DPStudy.rar

大佬总结

以上是大佬教程为你收集整理的Silverlight:Dependency Property(依赖属性)全部内容,希望文章能够帮你解决Silverlight:Dependency Property(依赖属性)所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。