EdwardShare

导航

 

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就会区改变布局等等一些操作。,这样就完成了界面的更新

 

 

 

 

------------------------后期继续更新,欢迎大家一起相互学习探讨  ,作者会不断更新,有什么问题可以留言。

 

------------------------我始终相信一支独放不是春,万紫千红春满园。希望有更多优秀的小伙伴加入其中。

 

------------------------如果有写错的地方,欢迎大家指出来。

 

 

 

 

 

 

 

 

 

 

 

 

posted on 2022-12-28 21:59  程序员的夏天  阅读(43)  评论(0编辑  收藏  举报