零起点学习WPF之《WPF揭秘》读书笔记(8)——第三章 属性值继承
3.2.3 属性值继承
属性值继承(简称属性继承)它不是传统的面向对象的类继承,而是指属性值自顶向下沿着员叔叔传递。
下面的代码在Window 元素上设置了Font属性。

<Window xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation "
xmlns:x= "http://schemas.microsoft.com/winfx/2006/xaml/presentation
Title ="属性继承" SizeToContent = "WidthAndHeight" FontSize = "30" FontStyle = " Italic"
Background = "OrangeRed">
<StackPanel>
<Label FontWeight = "Bold" FontSize = "20" Foreground = "White">WPF</Label>
<Label> WPF2</Label>
<ListBox>
<ListBoxItem> chapter 1</ListBoxItem>
<ListBoxItem> chapter 2</ListBoxItem>
</ListBox>
<StackPanel Orientation = "Horizontal" HorizontalAlignment = "Center">
<Button MinWidth = "75" Margin = "10">Help</Button>
<Button MinWidth = "75" Margin = "10">OK</Button>
</StackPanel>
<StatusBar >successed</StatusBar>
</StackPanel>
</Window>
对于大部分元素来说,这两个设置将会沿着逻辑树向下传递,并由子元素继承。这个继承会影响到Button 和 LisBox元素的。然而第一个Lable的FontSize却不会收到影响,因为它本身已经被显示的设置了为 20 ,这有点像“就近原则”。
注意:虽然StatusBar也像其他控件一样也支持这两种属性,但它的文本却不会收到两个属性的影响。
属性值的继承不行为是受以下的两种因素影响的:
(1)并不是每一个依赖属性都参与属性继承的。(从其内部来讲,以来属性会通过传递FrameworkPropertyMetadataOptions.Inherits给 DependencyProperty.Register方法来完成继承的 )
(2)有其他一些优先级更高的来源设置这些属性值。
在这个例子中,它满足后一种因素。有一些控件如StatusBar、Menu、ToolTip 控件其内部会把字体属性设置为当前的系统设置。通过这样方式,用户可以在控制面板中控制他们的字体,这对于用户来说这很熟悉,但是结果可能让你感觉更加迷惑,因为这样的控件会“吞噬”所有的继承,它会阻止继承元素沿着元素树继续向下传递。
【在其他地方使用属性继承:】
属性值的传递是基于元素树设计的,但是它已经被扩展到了其他上下文中。例如:值可以传递给一些看起来像XML子元素的一样的元素(这是由XAML属性元素语法造成的),但是它们并不是逻辑树或者是可视树中子元素。这些伪子元素( pseudo-children )可以是一个元素触发器、也可以是任意的属性值(并且不仅仅是Content或者Children),只要它是从Freezable派生而来的对象就行。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?