闲话WPF之十(Dependency属性 [2] )

在前一个Post中,曾提到将要重点研究Dependency属性的三个方面:变化通知;属性值的继承;支持多个提供对象。下面,我将分别就这三个内容进行简单地说明。

【变化通知】

在任何时候,只要Dependency属性的值发生了变化,WPF可以自动地根据属性的元数据触发不同的行为。前面提到过:Dependency属性最大的特点就是内建的变化通知功能。这种内建变化通知所提供的最值得注意的就是属性触发器(Property Trigger),就是它使用我们不需要编写任何的程序代码就能在属性变化使执行自定义行为。请看下面XAML编码的一个属性触发器例子:

<Trigger Property=”IsMouseOver” Value=”True”>

     <Setter Property=”Foreground” Value=”Blue”/>

</Trigger>

它的功能就是在属性值IsMouseOver变为True的时,将属性Foreground的值设置为Blue。而且,它会在IsMouseOver变为False时自动将Foreground的值设置为原来的值。就是这样简单的三行代码完成了我们曾经需要多个函数、变量才能实现的功能。

使用属性触发器时需要注意:触发器默认适用于每个类对象。 而且,在WPF 3.0中由于人为的限制,Property Trigger将不能应用在单独的元素。只能应用在某个Style对象之中。因此,如果想在某个单独对象上实现Property Trigger。必须用如下的XAML进行封装:

<Button MinWidth=”75” Margin=”10”>

<Button.Style>

     <Style TargetType=”{x:Type Button}”>

     <Style.Triggers>

           <Trigger Property=”IsMouseOver” Value=”True”>

                <Setter Property=”Foreground” Value=”Blue”/>

           </Trigger>

     </Style.Triggers>

     </Style>

</Button.Style>

     OK

</Button>

【属性值继承】

属性值继承是指在设置逻辑树某个结点元素的属性后,它的所有之结点都继承这个属性值(当然,前提是子元素必须支持这个属性)。我们仍然利用闲话WPF之八中的一个例子进行说明:

<Window FontSize=”30”>

     <StackPanel>

           <Label>LabelText</Lable>

     </StackPanel>

</Window>

我们修改了Window是FontSize属性为30。通过实际观察将发现它的子元素Label的FontSize也变为了30。注意这里的StackPanel是一个容器元素,它本身并不支持FontSize属性。

现在我们给上面的Window添加一个状态栏。XAML代码如下:

<Window ......>

     <StackPanel>

           <Label>LabelText</Lable>

           <StatusBar>This is a Statusbar</StatusBar>

     </StackPanel>

</Window>

这时你会发现:虽然StatusBar支持这个FontSize这个属性,它也是Window的子元素,但是它的字体大小却没有变化。为什么呢?因为并不是所有的元素都支持属性值继承。还存在如下两种例外的情况:

1、部分Dependency属性在用Register注册时可以指定Inherits为不可继承。

2、如果有其他更高优先级方法设置了其他的值。(关于优先级的介绍且看下面分解。)

部分控件如StatusBar、Menu和Tooptip内部设置它们的字体属性值以匹配当前系统的设置。这样用户通过控制面板可以修改它们的外观。这种方法存在一个问题:StatusBar等截获了从父元素继承来的属性,并且不影响其子元素。比如,如果我们在StatusBar中添加了一个Button。这个Button的字体属性会因为StatusBar的截断没没有改变,将保留其默认值。

附加说明:属性值继承的最初设计只适用于元素Tree,现在已经进行多个方面的扩展。比如,值可以传递下级看起来像Children,但在逻辑或者视觉Tree中并不是Children的某些元素。这些伪装的子元素可以是触发器、属性的值,只要它是从Freezable继承的对象。对于这些内容没有很好的文档说明。我们只需要能使用就行不必过多关心。

转载于:https://www.cnblogs.com/YilingLai/archive/2006/12/24/601994.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/277120.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1037 Magic Coupon

题目链接&#xff1a;https://pintia.cn/problem-sets/994805342720868352/problems/994805451374313472 这个题目有毒&#xff0c;开始我的while判断是使用的相乘大于0这种判断方式&#xff0c;但是最后一个案例始终过不了&#xff0c;可能是因为越界了&#xff0c;但是越界的…

利用解构赋值获取后端特定字段数据

很多时候&#xff0c;后端接口传过来的数据并不正好是我们需要的。有些场景下会有很多不需要的字段。 这时如果采用单个赋值的方法赋值数据无疑会比较麻烦。解决的办法就是利用解构赋值。 mounted(){let objs {name:test,sex:nan,caree:kaifa,height:180,country:country};({na…

理解ORACLE数据库字符集

一&#xff0e;引言 ORACLE数据库字符集&#xff0c;即Oracle全球化支持(Globalization Support)&#xff0c;或即国家语言支持&#xff08;NLS&#xff09;其作用是用本国语言和格式来存储、处理和检索数据。利用全球化支持&#xff0c;ORACLE为用户提供自己熟悉的数据库母语环…

软件设计师09-面向对象-用例图

感谢任铄老师滴视频 用例图 1&#xff09;描述一组用例、参与者及它们之间的关系 2&#xff09;用例模型用于需求分析阶段 3&#xff09;关系&#xff08;依赖关系&#xff09;&#xff1a;1&#xff09;包含&#xff08;include&#xff09; 1&#xff09;两个以上用例具有共同…

利用正则表达式截取特定字符中间字符

有如下场景&#xff0c;已知一个长字符串&#xff0c;需要获取指定字符串之间的字符。 // 已知字符串 var str body908888huhuc实测实《hu需要body和《hu之间的字符串。定义正则表达式。 var reg /(?<body).(?《hu)/;上述正则表达式利用了&#xff1a;获取指定字符串之后…

资源的积累

最近整理机器里边的各种文档&#xff0c;进行异地备份&#xff0c;整理后&#xff0c;看了看尺寸&#xff0c;天呀&#xff0c;竟然有855M&#xff0c;主要是各种文档、图片和代码等非2进制的东东。我按照日期整理了一下&#xff0c;最久的大概是在2003年&#xff0c;公司是在2…

【MySQL】4、Select查询语句

4.Select查询语句 4.1、select语句 <?php $servername "localhost"; $username "username"; $password "password"; $dbname "myDB";// 创建连接 $conn mysqli_connect($servername, $username, $password, $dbname); // Che…

一、环境调试确认

1、确认系统网络 2、确认yum可用 3、确认关闭iptables规则 4、确认停用selinux 两项安装 yum -y install gcc gcc-c autoconf pcre pcre-devel make automake yum -y install wget httpd-tools vim 一次初始化 cd /opt/ mkdir app backup download logs work转载于:https…

JavaScript方法

1、hasOwnProperty&#xff1a;是用来判断一个对象是否有你给出名称的属性或对象。不过需要注意的是&#xff0c;此方法无法检查该对象的原型链中是否具有该属性&#xff0c;该属性必须是对象本身的一个成员。isPrototypeOf是用来判断要检查其原型链的对象是否存在于指定对象实…

Ajax:如何运用updatepanle进行局部刷新

1.设定ScriptManager的EnablePartialRendering"true"(一般默认为true)2.设定要进行局部刷新panel的UpdateMode"Conditional"(本panel 的id为zz) 这样就可以保在本panle内的控件操作refresh页面时&#xff0c; 不会将整个page刷新&#xff0c;而刷新本pan…

Shell语法—— while 条件语句

while 循环语句 while 循环语句语法格式为&#xff1a; while < 条件表达式 > do指令 done 有关脚本运行的相关用法 命令说明sh file.sh &把 file.sh 脚本放到后台运行&#xff08;后台运行脚本的常用方法&#xff09;ctlc停止执行当前脚本或任务ctlz暂停执行当前脚本…

C变量常量

变量是指其值可以变化的量。计算机中&#xff0c;指令代码、数据都存储于内存中。变量也需要存储在内存中。在计算机中&#xff0c;每个变量都被分配了一块内存空间&#xff0c;在这些空间里存储的就是变量的值。变量之所以可以变化&#xff0c;就是这个存储空间可以存储不同的…

slot

slot就是父组件把内容分发给子组件,插槽模板是slot&#xff0c;它是一个空壳子&#xff0c;因为它的显示与隐藏以及最后用什么样的html模板显示由父组件控制。但是插槽显示的位置确由子组件自身决定&#xff0c;slot写在组件template的什么位置&#xff0c;父组件传过来的模板将…

手把手教你可复用的SSO组件设计(设计篇)

周末陪女朋友去了&#xff0c;没写&#xff0c;告罪&#xff0c;上班后急忙补上。 这里说到了可复用得设计&#xff0c;所谓可复用就是指的&#xff0c;引入Dll&#xff0c;改改配置就能使用&#xff0c;而不是打开源代码东改改西改改再来调试调试最后OK。我们这里尽量提高抽象…

Object类和常用的API

第一章Object类 1.1 概述 1),Object 类是Java语言所有“引用类型”的父类&#xff0c;括我们自定义的类、类库中的类&#xff0c;数组&#xff0c;集合&#xff0c;字符串。 2),所有的的引用类型都从Object类继承了一些方法&#xff1a; 如&#xff0c;1).toString() 2).equal…

前端能力划分

前端学习学的是什么&#xff0c;在不同的阶段我思考这个问题。 最近的结论是&#xff1a;前端学习要学的是前端的三大能力。工程能力&#xff0c;架构能力&#xff0c;开发能力。 工程能力 工程能力的范畴我认为涵盖了项目模板的自动化生成、项目的自动化编译和构建。 当然传统…

英语学习网址

英文写作网 &#xff08; www.4ewriting.com &#xff09;提供英文写作的各种相关技巧&#xff0c;主要内容包括写作语法文法、应用写作、考试作文、写作范文、背景文化 佳作欣赏、原创发表、英文blog、英语笔友、名师指导、写作论坛等。 1. 英语学习&#xff1a;英语学习频道(…

Anaconda+vscode+pytorch环境搭建

1、安装Anaconda Anaconda指的是一个开源的Python发行版本&#xff0c;其包含了conda、Python等180多个科学包及其依赖项。在官网上下载https://www.anaconda.com/distribution/&#xff0c;因为服务器在国外会很慢&#xff0c;建议从清华镜像https://mirrors.tuna.tsinghua.ed…

git learn

$ git config --global user.name "Your Name" $ git config --global user.email "emailexample.com"因为Git是分布式版本控制系统&#xff0c;所以&#xff0c;每个机器都必须自报家门&#xff1a;你的名字和Email地址。你也许会担心&#xff0c;如果有人…

C#.NET 中的类型转换

C# 出来也有些日子了&#xff0c;最近由于编程的需要&#xff0c;对 C# 的类型转换做了一些研究&#xff0c;其内容涉及 C# 的装箱/拆箱/别名、数值类型间相互转换、字符的 ASCII 码和 Unicode 码、数值字符串和数值之间的转换、字符串和字符数组/字节数组之间的转换、各种数值…