博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Wpf 依赖属性 附加属性
阅读量:5942 次
发布时间:2019-06-19

本文共 2816 字,大约阅读时间需要 9 分钟。

一、依赖属性

依赖属性就是自己自己没有值,通过Binding从数据源获得值,就是依赖在别人身上,拥有依赖属性的对象称为依赖对象。

几种应用依赖属性的场景:

1. 希望可在样式中设置属性。

2. 希望属性支持数据绑定。

3. 希望可使用动态资源引用设置属性。

4. 希望从元素树中的父元素自动继承属性值。

5. 希望属性可进行动画处理。

6. 希望属性系统在属性系统、环境或用户执行的操作或者读取并使用样式更改了属性以前的值时报告。

7. 希望使用已建立的、WPF 进程也使用的元数据约定,例如报告更改属性值时是否要求布局系统重新编写元素的可视化对象。

依赖对象创建时并不包含存储数据空间。WPF中必须使用依赖对象作为依赖属性的宿主。

 

声明和使用依赖属性

提示:创建依赖属性时可以使用代码片段propdp

1        
7
8
9
10
11
using System;     using System.Collections.Generic;     using System.Windows;     using System.Windows.Data;     using System.Windows.Documents;            namespace DeepXAML     {        public partial class MainWindow : Window         {             public MainWindow()             {                 InitializeComponent();                 Game game = new Game { Title = "WarCraft" };                 this.stackPanel.DataContext = game;             }         }                public class Game:DependencyObject         {             public string Title             {                get { return (string)GetValue(NameProperty); }                 set { SetValue(NameProperty, value); }             }             // Using a DependencyProperty as the backing store for Name.  This enables animation, styling, binding, etc...             public static readonly DependencyProperty NameProperty =                 DependencyProperty.Register("Title", typeof(string), typeof(Game));                 }       }

DependencyProperty.Register方法解释

a.第一个参数指明以哪个CLR属性作为依赖属性的包装

b. 第二参数指明依赖属性存期什么类型的值

c. 此依赖属性宿主的类型。

依赖属性的值存在哪里?

在WPF运行时,维护了一个全局的Hashtable存取依赖属性的值。

 

二、附加属性

附加属性就是自己没有这个属性,在某些上下文中需要就被附加上去。比如TextBox的Grid.Row属性,如果我们定义TextBox类时定义一个Row属性是没有意义的,因为我们并不知道一定会放在Grid里,这样就造成了浪费。

1 01     
7 07
8 08
9 09
10 10
11 11
12 12
13 13
14 14
15 15

实际上在编译后,Grid.Row会在Grid的类里生成SetRow方法,Grid来调整控件的控制。也就是附加属性会生成方法,不会占用内存空间。

1      public class GameAP : DependencyObject 2      { 3          public static int GetName(DependencyObject obj) 4          { 5              return (int)obj.GetValue(NameProperty); 6          } 7         8          public static void SetName(DependencyObject obj, int value) 9          {10              obj.SetValue(NameProperty, value);11          }12        13          // Using a DependencyProperty as the backing store for Name.  This enables animation, styling, binding, etc...14          public static readonly DependencyProperty NameProperty =15              DependencyProperty.RegisterAttached("Name", typeof(int), typeof(GameAP), new UIPropertyMetadata(0));16            17      }

 

转载于:https://www.cnblogs.com/XzcBlog/archive/2013/04/24/3039665.html

你可能感兴趣的文章
有序的双链表
查看>>
程序员全国不同地区,微信(面试 招聘)群。
查看>>
【干货】界面控件DevExtreme视频教程大汇总!
查看>>
闭包 !if(){}.call()
查看>>
python MySQLdb安装和使用
查看>>
Java小细节
查看>>
poj - 1860 Currency Exchange
查看>>
chgrp命令
查看>>
Java集合框架GS Collections具体解释
查看>>
洛谷 P2486 BZOJ 2243 [SDOI2011]染色
查看>>
linux 笔记本的温度提示
查看>>
数值积分中的辛普森方法及其误差估计
查看>>
Web service (一) 原理和项目开发实战
查看>>
跑带宽度多少合适_跑步机选购跑带要多宽,你的身体早就告诉你了
查看>>
广平县北方计算机第一届PS设计大赛
查看>>
深入理解Java的接口和抽象类
查看>>
java与xml
查看>>
Javascript异步数据的同步处理方法
查看>>
iis6 zencart1.39 伪静态规则
查看>>
SQL Server代理(3/12):代理警报和操作员
查看>>