`
Virgo_S
  • 浏览: 1151054 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

    博客分类:
  • .NET
阅读更多
学习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
<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中的文本控件的文字也将变成"新值"
  • 大小: 43 KB
分享到:
评论

相关推荐

    WPF 依赖属性依赖属性依赖属性依赖属性

    在Windows Presentation Foundation(WPF)中,依赖属性(Dependency Property)是实现数据绑定(Data Binding)的核心机制之一。依赖属性允许UI元素与数据源之间建立动态的连接,从而实现视图与模型之间的自动同步...

    依赖注入:Dependency injection-英文书签文字版

    本资源“依赖注入:Dependency injection-英文书签文字版”提供了一份关于Spring框架中依赖注入的详细讲解,以英文文本的形式呈现,并且带有书签,方便读者快速定位和学习。 依赖注入的核心思想是将组件之间的依赖...

    依赖属性实现绑定

    在WPF(Windows Presentation Foundation)开发中,依赖属性(Dependency Property)是实现数据绑定的关键机制。依赖属性允许控件的属性与其他对象的数据源保持同步,从而实现数据驱动的用户界面。接下来,我们将...

    WPF依赖项属性示例

    在Windows Presentation Foundation(WPF)中,依赖项属性(Dependency Property)是框架的核心特性之一,它为UI元素提供了数据绑定、样式设定、动画支持以及事件处理等强大功能。依赖项属性的机制使得WPF控件能够...

    dependency.rar查看依赖库文件工具

    "dependency.rar" 提供了这样的功能,帮助用户查看和理解项目的依赖结构,确保所有必要的库和框架都适当地被引用和版本匹配。下面将详细探讨依赖管理的重要性、依赖库文件工具的功能以及如何使用此类工具。 1. **...

    【Dependency Walker资源】Dependency Walker 是一个免费的模块依赖性分析工具

    资源介绍:Dependency Walker(依赖项查看器)是一款强大而实用的免费模块依赖性分析工具,专为Windows系统打造,旨在帮助开发者和系统管理员轻松解析和查看应用程序或DLL文件的依赖关系。 Dependency Walker通过...

    Dependency Walker可以查看C++文件所依赖的所有dll

    Dependency Walker,通常缩写为Depends,是一款强大的分析工具,主要用在Windows操作系统环境中,用于检查和理解C++编译的可执行文件或动态链接库(DLL)所依赖的其他DLL模块。这款软件能帮助开发者识别和解决程序...

    自己平时练手的代码,依赖属性和路由事件

    在IT行业中,依赖属性(Dependency Property)是一种在WPF(Windows Presentation Foundation)和UWP(Universal Windows Platform)框架中广泛使用的特性,它允许组件之间共享数据并实现动态更新。依赖属性提供了一...

    WPF源码:依赖属性回调、验证及强制值.rar

    它提供了丰富的用户界面元素和设计模式,其中包括依赖属性(Dependency Property)系统。本篇将深入探讨依赖属性的回调、验证和强制值这三个核心概念,并通过一个名为"WpfApplication2"的项目源码进行详细阐述。** ##...

    Unresolved dependency: 'com.aspose:aspose:jar:19'

    然而,有时我们可能会遇到一些特定的依赖问题,比如在这个案例中,"Unresolved dependency: 'com.aspose:aspose:jar:19'",意味着在执行Maven构建时,Maven无法从配置的阿里云仓库中找到`com.aspose:aspose:jar:19`...

    依赖属性+附加属性,依赖属性+附加属性

    在C#编程中,依赖属性(Dependency Property)和附加属性(Attached Property)是WPF(Windows Presentation Foundation)框架中的核心特性,它们对于构建可复用和灵活的UI组件至关重要。这两种属性类型允许开发者以...

    dependency-checker:Dependency Checker SonarQube插件

    9. **教育和培训**:团队成员应该了解依赖检查的重要性,知道如何解读扫描结果,并学习如何处理潜在的安全问题。 10. **持续改进**:依赖检查不应只在项目初期进行,而应在整个软件生命周期中持续进行,确保新添加...

    Dependency Walker: Windows DLL依赖查看工具

    Dependency Walker 是 Microsoft Visual C++ 中提供的非常有用的 PE 模块依赖性分析工具。主要功能如下: 查看 PE 模块的导入模块。 查看 PE 模块的导入和导出函数。 动态剖析 PE 模块的模块依赖性。 解析 ...

    依赖属性Demo

    在.NET框架中,依赖属性(Dependency Property)是WPF(Windows Presentation Foundation)和Silverlight等技术中的一个重要概念,它提供了一种灵活的方式来管理和绑定对象的属性。依赖属性系统允许属性值的动态更改...

    在Ubuntu14.04上离线安装mysql5.7.19时需要的两个依赖包

    从mysql官网上下载mysql-server_5.7.21-1ubuntu14.04_amd64.deb-bundle.tar,然后进行离线安装,解压该安装包,会出现11个依赖包,按照顺序依次使用sudo dpkg -i 进行安装,中间会报错,显示缺少相应的依赖,具体...

    MVVM Usercontrol 依赖属性 前台后台双向数据绑定

    **依赖属性(Dependency Property)**是WPF中的一个重要特性,它允许控件的属性与其他对象(如视图模型)的属性进行绑定,并且支持数据验证、动画和依赖项跟踪。依赖属性的定义包括注册属性、设置默认值、数据类型...

    Depends (Dependency Walker) 依赖库查看工具

    "Depends (Dependency Walker)"是一款强大的系统工具,主要用于分析Windows应用程序和动态链接库(DLLs)的依赖关系。它能够帮助开发者和系统管理员理解程序在运行时需要哪些库文件,从而解决因缺失或版本不匹配的库...

    dependency walker 64位版

    Dependency Walker,通常被称为依赖项浏览器或Depends,是一款强大的系统工具,主要用来分析Windows应用程序及其动态链接库(DLL)的依赖关系。64位版本的Dependency Walker是专门为处理64位Windows操作系统上的程序...

    dependency-check-gradle:依赖项检查gradle插件使项目可以监视依赖库中的已知已发布漏洞

    依赖检查等级 依赖项检查gradle插件允许项目监视从属库是否存在已知的已发布漏洞。 当前的版本 最新版本是 用法 以下是快速入门说明。 请参阅以获取有关配置和用法的更多详细信息。 第1步,应用依赖项检查Gradle...

Global site tag (gtag.js) - Google Analytics