‫欢迎回来｡
‫在本视频中, 我们将讨论依赖属性, 一旦我们开始数据绑定, 它们就变得非常重要｡
‫一般来说, 了解它们是如何工作的是有意义的｡
‫因此, 让我们继续在网格中创建一个按钮｡
‫我们只需要创建button关键字就可以了, 我们已经多次看到了｡
‫在这里, 我将指定高度为100像素, 宽度为200像素, 然后指定Click
‫Me的内容｡
‫现在我想用一个叫做背景的东西｡
‫这里有一个属性叫background, 我想把它赋值给一个sewer｡
‫这就是我的按钮｡
‫你现在可以看到, 它只有锯齿的颜色｡
‫也许我们应该把它变成红色｡
‫好吧, 红色｡
‫很强烈｡
‫紫红色｡
‫看起来不错｡
‫这么简单的颜色｡
‫我想继续向你们解释什么是依赖属性, 它们在哪里,
‫以及如何创建你们自己的依赖属性｡
‫比如说, 用一个按钮就可以很容易地做到｡
‫顺便说一下, 这个按钮, 实际上我会像这样关闭它, 因为我想设计这个按钮｡
‫因此, 在按钮标记中, 我想为该按钮添加一些样式, 该样式应该是一个触发器｡
‫所以我要扣扳机｡
‫所以如果我进入按钮区域, 那么我想改变颜色或者类似的东西｡
‫所以我将使用按钮点样式｡
‫现在, 按钮样式需要在此处创建一个样式, 以便我可以在此处创建自己的样式, 并为该样式设置一个目标｡
‫目标类型将为按钮｡
‫这还不够, 因为我现在要做的是在这个风格中添加一个触发器｡
‫所以我要使用风格触发器｡
‫就像这个｡
‫现在, 我可以继续创建漂亮的小触发器, 一旦事件发生, 这些触发器就会被触发｡
‫我们已经看到了一些事件, 但这是一个有点不同的事件｡
‫所以这是一个触发器, 我们可以如下使用｡
‫我们可以在这里创建一个触发器, 该触发器将具有一个属性｡
‫比如说, 鼠标悬停在上面｡
‫因此, 一旦鼠标位于该按钮上, 则应将值设置为true｡
‫在这个触发器中, 我需要有二传手｡
‫如果是这样的话, 会发生什么呢？
‫我将把属性字体大小设置为30, 因为现在字体大小要小得多.
‫这里我们有一个按钮, 它有一个特定的宽度､ 内容和宽度等等｡
‫我把它做成了浅紫红色｡
‫然后我给那个按钮添加了一个样式｡
‫而我添加的风格实际上是一个触发器｡
‫所以我可以有一个叫做风格触发器的东西, 它会触发风格的改变,
‫一旦鼠标在那个按钮上, 触发器就会运行, 这会设置一些东西｡
‫它会将字体大小设置为我们在此处指定的值｡
‫这里我们赋值｡
‫True表示一旦鼠标悬停在其上就会触发｡
‫当我们将鼠标悬停在按钮上时, 这是正确的｡
‫所以如果我们运行它, 我们应该会看到一些变化｡
‫这是一个相当长的方法, 只是有一个悬停功能, 但它是很多, 我们想在这里使用｡
‫所以你看, 我把鼠标悬停在它上面, 颜色变成了蓝色｡
‫然后我们看到了这个文本, 它看起来更大了｡
‫因此该值将更改为30｡
‫所以这很好｡
‫但是为什么我们需要这么长的代码呢？
‫问题是我们在这里使用了属性｡
‫正如你所看到的,
‫这个东西叫做属性, 实际上宽度是一个属性, 内容是一个属性, 背景是一个属性,
‫它们依赖于依赖属性, 或者它们连接到依赖属性, 它们对数据绑定很重要｡
‫正如我所说的,
‫我们将在下一个视频或下一个视频中介绍, 但它们也很重要, 有这个触发事件或按钮是知道发生了什么｡
‫因此, 让我们继续在主窗口方法中创建一个按钮｡
‫创建一个按钮, 现在我要检查类本身.
‫因此, 转到定义, 这样您就可以简单地按F12键来获得定义｡
‫它会显示按钮类｡
‫正如你所看到的, 它是一个继承自button based的类｡
‫存在一个静态只读依赖属性, 该属性是取消的默认属性, 该属性是默认属性｡
‫所以不要太多｡
‫但你也可以看到这里实际上有一个正常的属性｡
‫这是一个类属性, 我们在这里称之为默认取消, 默认,
‫这些都连接到那些依赖属性.
‫因此, 它表示可以通过样式化数据､ 绑定动画和继承等方法进行设置的属性｡
‫正如我所说的, 数据绑定是我们稍后将讨论的内容｡
‫造型, 这很好｡
‫我们刚才所做的, 我们设计了我们的按钮, 我们可以使用动画和继承｡
‫但现在让我们更深入地了解一下按钮基, 这样我们就知道按钮是从按钮基继承的｡
‫然后我们可以去定义按钮底座并进行检查｡
‫好吧, 我会的
‫这是一个内容控制类｡
‫因此, 按钮基是从内容控件继承的, 而内容控件｡
‫按钮库有一个根事件, 如您所见, 一个单击事件.
‫我们上节课已经看到, 包含的事件是,
‫它也有很多依赖属性, 例如按下单击模式､ 属性命令､ 目标等｡
‫但我们还没有触及其中的一些｡
‫但更有趣的是, 如果我们更深入地研究内容控件,
‫我们可以看到有一个属性说有内容｡
‫因此, 这个函数负责处理按钮的所有内容｡
‫例如, 文本是按钮内的文本块｡
‫如果我们的按钮中有内容, 那么｡
‫它是由这个类处理的, 所以是由这个内容控件类处理的｡
‫实际上, 我们可以更深入地了解定义, 在这里我们会发现大量的依赖属性和两个根事件｡
‫并且这个控件类具有依赖属性, 称为填充属性, 而不是边框画笔｡
‫所以边框的颜色再一次出现垂直内容对齐, 水平内容对齐｡
‫现在这个对我们来说很有趣因为我们用了它｡
‫这是一个背景属性, 这正是我们在XAML文件中设置的属性｡
‫如您所见, 我们将背景设置为Pale Violet Red, 以便可以通过此处的属性访问这些依赖项属性｡
‫这些是我们的属性, 比如字体大小､ 字体､ 家族背景､
‫前景, 所有这些我们在使用控件时都会用到的属性｡
‫例如, 按钮是控件, 或者文本块也是控件｡
‫因此, 它们都继承自该控件类, 并且都具有这些依赖属性,
‫这些属性随后触发并通知油井变化｡
‫这里我们还看到, 依赖属性有一点很重要, 那就是它们始终是静态的, 并且是只读的｡
‫所以这一点非常重要｡
‫此外, 您还可以看到, 它们始终以属性名称结尾｡
‫因此, 每当我们定义一个依赖属性时, 我们就称之为background, 它与属性本身同名｡
‫比如这里, 他们的背景在哪里, 还有最后的财产一词.
‫这个故事很长, 我们也很深入, 但这会让你更清楚地了解这些依赖属性是什么,
‫以及我们一直在处理什么｡
‫所以我们只是在玩弄属性, 但它们实际上是在玩弄依赖属性｡
‫为什么我们需要这些？
‫为了理解这个触发器的作用, WPF在这里使用了一个依赖属性｡
‫例如, this is mouse over and
‫is mouse over在依赖属性的帮助下向WPF提供了一个链通知, 并允许我们将值设置为true｡
‫如果你也去看看, 因为我还没有接触过｡
‫实际上有构建错误, 所以我们需要去掉这个按钮｡
‫但我还没有涉及到的是以下内容, 这是非常重要的｡
‫您可以看到, 我们有一个触发器, 它说属性是鼠标经过值｡
‫是的｡
‫一旦鼠标悬停在上面, 它就会触发, 这是真的, 它会做什么？
‫嗯, 它会将字体大小等属性设置为30｡
‫让我再演示一次｡
‫看, 看｡
‫但现在如果我离开按钮, 你可以看到, 嘿, 它变回来了, 这是由依赖属性完成的｡
‫因此, 它是在告知正在发生的事情, 它是在销售, 将字体大小的价值恢复到原来的价值｡
‫正如你所看到的, 只有当鼠标在上面的时候才是真的, 这是通过依赖属性实现的｡
‫关于依赖项属性, 我说过它们应该始终是静态和只读的,
‫这是因为所有控件都应该是共享和可用的｡
‫因此, 您不希望控件只能使用一次｡
‫您还希望它可用于其他类和其他视图等｡
‫它是静态的, 因为初始化后该值不应更改｡
‫这个依赖属性触发器的链通知是数据挖掘､ 动画､ 触发器（如我们在这里看到的）､
‫样式等所必需的｡
‫现在, 如果您想继续创建自己的依赖项属性, 可以按照以下方式进行｡
‫所以我要在这个类中创建一个新的属性｡
‫我打算跟注｡
‫我们把它放在最上面
‫我将把它命名为“公有”｡
‫正如我所说的, 这是一个c LR属性, 在这里我需要有一个get和一个set, 但这还不够｡
‫我马上就调整好｡
‫让我们为该my属性创建一个依赖项属性｡
‫所以我将创建一个公共的静态只读依赖属性, 称为我的依赖属性, 这个依赖属性应该直接用依赖属性点寄存器初始化｡
‫因此, 我们要注册一个新的依赖属性, 并且需要分配多个属性｡
‫例如, 我们需要一个字符串名, 我将调用它｡
‫我的属性, 那么我们需要属性类型｡
‫那么, 该属性应该属于哪种类型呢？
‫正如我们在这里看到的, 我的属性是int类型的｡
‫所以我会用int的类型｡
‫接下来, 我们需要键入property owner｡
‫所以这个类型的所有者和这个类型的所有者我的属性是我的主窗口类因为它在main no类里.
‫因此, 我们只需简单地说type of将是主窗口, 现在我们还需要移交属性元数据｡
‫因此, 我将创建一个新的属性元数据, 它将为零｡
‫所以我在这里输入0, 这里不要太花哨, 就这样.
‫这就是我们创建依赖属性的方法｡
‫而现在我的属性本身当然也应该受到这个依赖属性的影响｡
‫为了做到这一点, 我需要继续调整get和set, 这样getter应该返回我们的get值,
‫我的依赖属性｡
‫但是现在我们遇到了这样的问题,
‫依赖属性的值是类型依赖属性, 即使我们设置它是int类型, 我们仍然需要将它转换为在其中.
‫我将把它转换成一个整数, 现在我们可以关闭这个getter, 关闭语句, 更确切地说,
‫现在setter应该是set value.
‫这里我将dependency属性设置为给定的值｡
‫这就是我们在这里所做的, 也是你如何创建你自己的依赖属性｡
‫这就是静态只读的重要之处｡
‫您需要将其创建为依赖关系属性类型｡
‫你可以给予它一个名字, 然后你需要注册它, 你需要给它一个名字, 一个类型,
‫和所有者在哪里或所有者是什么｡
‫因此, 在其中创建属性的类, 然后您需要传递一些属性元数据,
‫以便可以添加一些其他属性元数据｡
‫正如您所看到的, 有四种不同的重载, 您可以移交一个对象, 它是默认值｡
‫我只是说, 好吧, 默认值为零｡
‫由于我在这里设置了属性元数据, 所以我的属性将默认为零｡
‫好吧, 我会的
‫所以这里有很多东西｡
‫根据您要开发的内容, 您可能永远不会创建自己的依赖项属性｡
‫因此, 如果您在某个时候需要使用依赖项属性, 请不必担心, 然后查看如何创建您自己的依赖项属性｡
‫否则, 您可以简单地使用我们在这里为最终用户提供的属性, 或者让我们假设为只构建UI的开发人员提供的属性,
‫这些属性与最终用户无关｡
‫但我只想告诉你事情是如何建立起来的, 这里什么是重要的｡
‫好吧, 我会的
‫下一段视频再见｡