1.理解依赖项属性 特别重要,而且特别难
理解依赖项属性这个东西我查阅了微软的官方文件给出的解释是:
Windows Presentation Foundation (WPF) 提供一组服务,这些服务可用于扩展类型的属性的功能。 这些服务统称为 WPF 属性系统。 由 WPF 属性系统提供支持的属性称为依赖属性。 本概述文章介绍 WPF 属性系统和依赖属性的功能,包括如何在 XAML 和代码中使用现有的依赖属性。 本概述还介绍依赖属性所特有的方面(如依赖属性元数据),并说明如何在自定义类中创建自己的依赖属性。
我这里面举例了我定义了一个按钮当点击按钮了之后改变背景颜色,这个功能实现起来非常简单,我的理解是我为按钮添加了一个点击事件
在点击事件里面,我就干了一件事情给背景变颜色。
private void DoMyClick(object sender, RoutedEventArgs e)
{
Back.Background = new SolidColorBrush(Colors.Aquamarine);
}
一般来说C#的属性和字段只是接受了数据
那么,我改变的是Back这个变量的背景色这个字段,那么为啥界面会跟着变化?这他妈的就神奇了
依赖项属性存在的意义就是建立字段和UI之间的联系
举个例子:
我想自己写一个Class ,里面有个string UserName,这时候可以设置或者获取UserName的值。但是我赋予了字段或者属性一个值,它是如何去更新我的界面的 。依赖项属性就起到这个作用。
这是微软官方给出的
依赖项属性的理解就是在我原来的属性的基础上增加了新的功能,属性之上增加了额外的功能。这是重点
2.依赖项属性怎么使用?
通过上面的介绍, 也大概明白了,但是没有完全明白依赖项属性是干嘛的,但是知道了干嘛的不够,因为我们需要知道的是这么使用,这才是王道。实干才是硬道理
接下来就是运用:
1 .定义依赖项属性
2 .注册依赖项属性
3 .添加包装类
假如我想自定义控件,那么怎么办?自定义的控件一般从UI element继承越往下继承控件的实现越多。
private void DoMyClick(object sender, RoutedEventArgs e)
{
Back.Background = new SolidColorBrush(Colors.Aquamarine);
string username = test.UserName;
test.UserName = "4564565";
}
上述代码展示的是我自定义了一个控件,我在XAML中我也添加了这个控件,这些都没有问题嘎嘎好使,下面重点:
我在DoMyClick读取UserName的值,这个没毛病,读到了,但是我想更改这个值,不行,界面没有更新。
怎么让它更新?
1 定义它,定义依耐性属性
DependencyProperty UserNameProperty;
我定义了一个依赖属性就OK了吗?不是,当我的class在使用之前就要我使用之前初始化,所以这个东西必须是静态的,初始化函数也要是静态的
public readonly static DependencyProperty UserNameProperty;
static Class1()
{
UserNameProperty = DependencyProperty.Register();
}
Register这个函数是注册,里面包含5个参数
// 摘要:
// Registers a dependency property with the specified property name, property type,
// owner type, property metadata, and a value validation callback for the property.
//
// 参数:
// name: 哪个参数需要添加依赖项属性
// The name of the dependency property to register.
//
// propertyType: 属性的类型 取这个类型typeof()
// The type of the property.
//
// ownerType: 属于哪一个对象 typeof()
// The owner type that is registering the dependency property.
//
// typeMetadata: 媒介参数
// Property metadata for the dependency property.
//
// validateValueCallback: 数据校验
// A reference to a callback that should perform any custom validation of the dependency
// property value beyond typical type validation.
//
// 返回结果:
// A dependency property identifier that should be used to set the value of a public
// static readonly field in your class. That identifier is then used to reference
// the dependency property later, for operations such as setting its value programmatically
// or obtaining metadata.
// typeMetadata: 媒介参数
FrameworkPropertyMetadata metadata = new FrameworkPropertyMetadata();用她的子实现类
FrameworkPropertyMetadata的构造函数就老多了
1defultValue 指的是初始化变量的值,依赖项的属性最大的好处就是我的数据初始化不需要放在username里面
FrameworkPropertyMetadata metadata1 = new FrameworkPropertyMetadata("1252");
UserNameProperty = DependencyProperty.Register("UserName",typeof(string),typeof(Class1), metadata1);
下一步怎么关联
3 .添加包装类 相当于属性和依耐项属性建立关联
当对UserName设置值,会触发set 方法,当触发了set就会区改变布局等等一些操作。,这样就完成了界面的更新
------------------------后期继续更新,欢迎大家一起相互学习探讨 ,作者会不断更新,有什么问题可以留言。
------------------------我始终相信一支独放不是春,万紫千红春满园。希望有更多优秀的小伙伴加入其中。
------------------------如果有写错的地方,欢迎大家指出来。