附加属性,顾名思义,和被附加的控件没有依赖关系,只是强行给目标控件挂上一个“属性值”,以便于操作之。就好比,你在学校是学生,那么就要听老师的管教,在公司是下属,就要服从老板的命令一样。

我们常见的附加属性有grid.row,canvas.left等属性,这些属性目标控件并无多大关联,附加到你所使用的控件上,则可以被其真实依赖的对象所"驱动"。

下面我们来简单模拟以下Canvas.Left的实现方式。

如图,这是我们正常情况下使用附加属性的情景。

现在我们做一个我们自定义的“Canvas.Left”

1.建立附加属性真实依赖对象以及附加属性

新建附加属性与依赖属性如出一辙,只是Api稍不同。

public static DependencyProperty
LeftProperty = DependencyProperty.RegisterAttached
("Left", typeof(double), typeof(Bruce), new PropertyMetadata(0.0)

设置属性的显示名称所属类型以及初始值

之后给该属性设置Get,Set静态方法,不然再Xaml中访问不到,很好理解,你再xaml中某个控件中也不太方便new其他的控件啊!这里的Get,Set猜测是反射获取调用的,熟悉java的同学应该看着比较亲切。

public static double GetLeft(DependencyObject obj)
{
return (double)obj.GetValue(LeftProperty);
}
public static void SetLeft(DependencyObject obj,object value)
{
obj.SetValue(LeftProperty, value);
}

最后在xaml中在目标控件上,添加此属性。

 2.添加"行为"

到这边我们的附加属性已经设置好了,但是只是给它赋值了,还没有添加属性的行为。

public static DependencyProperty
LeftProperty = DependencyProperty.RegisterAttached
("Left", typeof(double), typeof(Bruce), new PropertyMetadata(0.0,(obj,e)=>
{
var element=obj as FrameworkElement;//目标控件
if (element.Parent.GetType() == typeof(Canvas))
{
element.Margin = new Thickness((double)e.NewValue,,,);
}
}));

到这里我们的"Bruce.Left"附加属性就完成了,咱们来看看效果。

最后附上全部代码

public class Bruce:DependencyObject
{
public static double GetLeft(DependencyObject obj)
{
return (double)obj.GetValue(LeftProperty);
}
public static void SetLeft(DependencyObject obj,object value)
{
obj.SetValue(LeftProperty, value);
}
public static DependencyProperty
LeftProperty = DependencyProperty.RegisterAttached
("Left", typeof(double), typeof(Bruce), new PropertyMetadata(0.0,(obj,e)=>
{
var element=obj as FrameworkElement;//目标控件
if (element.Parent.GetType() == typeof(Canvas))
{
element.Margin = new Thickness((double)e.NewValue,,,);
}
})); }

WPF属性之理解附加属性的更多相关文章

  1. WPF属性(二)附加属性

    原文:WPF属性(二)附加属性 附加属性是说一个属性本来不属于某个对象,但由于某种需求而被后来附加上,也就是把对象放入一个特定环境后对象才具有的属性就称为附加属性,附加属性的作用就是将属性与数据类型解 ...

  2. WPF - 属性系统 - APaas(AttachedProperty as a service)

    是的,文章的题目看起来很牛,我承认. 附加属性是WPF中的一个非常重要的功能.例如在设置布局的过程中,软件开发人员就常常通过DockPanel的Dock附加属性来设置其各个子元素所处的布局位置.同样地 ...

  3. WPF - 属性系统 (4 of 4)

    依赖项属性的重写 在基于C#的编程中,对属性的重写常常是一种行之有效的解决方案:在基类所提供的属性访问符实现不能满足当前要求的时候,我们就需要重新定义属性的访问符. 但对于依赖项属性而言,属性执行逻辑 ...

  4. WPF - 属性系统 (2 of 4)

    属性更改回调 前一章的示例中,对各个参数的设置都非常容易理解.如果我们仅仅需要创建一个独立的依赖项属性,那么上面所提到的创建依赖项属性的基础知识足以满足需求.但是事情往往并非如此完美.在一个系统中,很 ...

  5. WPF - 属性系统 (1 of 4)

    本来我希望这一系列文章能够深入讲解WPF属性系统的实现以及XAML编译器是如何使用这些依赖项属性的,并在最后分析WPF属性系统的实际实现代码.但是在编写的过程中发现对WPF属性系统代码的讲解要求之前的 ...

  6. WPF - 属性系统 (3 of 4)

    依赖项属性元数据 在前面的章节中,我们已经介绍了WPF依赖项属性元数据中的两个组成:CoerceValueCallback回调以及PropertyChangedCallback.而在本节中,我们将对其 ...

  7. iOS数据存储之属性列表理解

    iOS数据存储之属性列表理解 数据存储简介 数据存储,即数据持久化,是指以何种方式保存应用程序的数据. 我的理解是,开发了一款应用之后,应用在内存中运行时会产生很多数据,这些数据在程序运行时和程序一起 ...

  8. prototype属性的理解

    1.对象:对象是JS的基本数据类型(原始类型(数字.字符串和布尔值),对象类型).对象是一种复合值:它将很多值(原始值或者其他对象)聚合在一起,可通过名字访问这些值. 2.三类JS对象和两类属性: 内 ...

  9. WPF 属性系统 依赖属性之内存占用分析

    关于WPF的属性系统园子内有不少这方面的文章.里面大都提到了WPF依赖属性的在内存方面的优化.但是里面大都一笔带过.那么WPF到底是怎么样节约内存的.我们通过WPF属性和普通的CLR属性对比来看一下W ...

随机推荐

  1. (一:NIO系列)JAVA NIO 简介

    出处:JAVA NIO 简介 Java 中 New I/O类库 是由 Java 1.4 引进的异步 IO.由于之前老的I/O类库是阻塞I/O,New I/O类库的目标就是要让Java支持非阻塞I/O, ...

  2. Untiy3D按方向键获取值

    一,如下代码 float h = Input.GetAxis("Horizontal"); float v = Input.GetAxis("Vertical" ...

  3. Vue.js——60分钟组件快速入门(上篇)二

    来源:https://www.cnblogs.com/keepfool/p/5625583.html 组件简介 组件系统是Vue.js其中一个重要的概念,它提供了一种抽象,让我们可以使用独立可复用的小 ...

  4. sftp没有关闭session导致服务器sshd进程未关闭

    项目中需要用Sftp上传下载文件,通过jsch中的sftp实现.代码上了服务器之后,发觉服务器多了很多进程没有被关闭. 连接sftp代码: protected boolean connectToSer ...

  5. 遍历并读取指定目录下的所有文件内容,写入Map集合然后输出在控制台和本地文件

    public class FileWrite { public static void main(String[] args) throws Exception { //封装数据源目录 File sr ...

  6. AI-sklearn 学习笔记(一)sklearn 一般概念

    scikit-learn Machine Learning in Python Simple and efficient tools for data mining and data analysis ...

  7. mysql 导出表中数据为excel的xls格式文件

    需求: 利用mysql客户端导出数据库中数据,以便进行分析,统计. 解决命令: 在windos命令行(linux同理)下,用如下命令即可: mysql -hlocalhost -uroot -ppas ...

  8. tomcat的跳转与日志

    1.跳转的关键性配置; 2. 日志的配置 1.跳转的关键性配置 当用户访问http://www.a.com/test时,会跳转打开/var/www/html目录下的页面 关键性配置如下: [root@ ...

  9. sys模块 json pickle模块

    # sys模块# import sys# sys.path# sys.argv# sys.exit() # 脚本退出# print('[%s]'%('#'*1))# print('[%s]'%('#' ...

  10. windows下zookeeper集群安装

    windows下zookeeper单机版安装,见:https://www.cnblogs.com/lbky/p/9867899.html 一:zookeeper节点为什么是奇数个? 单机模式的zk进程 ...