零起点学习WPF之《WPF揭秘》读书笔记(8)——第三章 属性值继承
时间:2010-09-11 来源:誓言
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> chapter1</ListBoxItem>
<ListBoxItem> chapter2</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>
对于大部分元素来说,这两个设置将会沿着逻辑树向下传递,并由子元素继承。这个继承会影响到Button 和 LisBox元素的。然而第一个Lable的FontSize却不会收到影响,因为它本身已经被显示的设置了为 20 ,这有点像“就近原则”。
注意:虽然StatusBar也像其他控件一样也支持这两种属性,但它的文本却不会收到两个属性的影响。
属性值的继承不行为是受以下的两种因素影响的:
(1)并不是每一个依赖属性都参与属性继承的。(从其内部来讲,以来属性会通过传递FrameworkPropertyMetadataOptions.Inherits给 DependencyProperty.Register方法来完成继承的 )
(2)有其他一些优先级更高的来源设置这些属性值。
在这个例子中,它满足后一种因素。有一些控件如StatusBar、Menu、ToolTip 控件其内部会把字体属性设置为当前的系统设置。通过这样方式,用户可以在控制面板中控制他们的字体,这对于用户来说这很熟悉,但是结果可能让你感觉更加迷惑,因为这样的控件会“吞噬”所有的继承,它会阻止继承元素沿着元素树继续向下传递。
【在其他地方使用属性继承:】
属性值的传递是基于元素树设计的,但是它已经被扩展到了其他上下文中。例如:值可以传递给一些看起来像XML子元素的一样的元素(这是由XAML属性元素语法造成的),但是它们并不是逻辑树或者是可视树中子元素。这些伪子元素( pseudo-children )可以是一个元素触发器、也可以是任意的属性值(并且不仅仅是Content或者Children),只要它是从Freezable派生而来的对象就行。