如果之前是来自 Web 开发领域,使用HTML和CSS,那么会很快意识到 XAML 与 HTML 非常相似:使用标签,可以定义应用程序的结构布局。
甚至可以使用内联属性(如 Foreground、FontSize 等)让这些元素看起来像某种方式,就像可以在本地设置 HTML 标签的样式一样。
但是当想在三个不同的 TextBlock 控件上使用完全相同的字体大小和颜色时会发生什么?可以将所需的属性复制/粘贴到它们中的每一个,但是当三个控件变成 50 个控件并分布在多个窗口时会发生什么?当意识到字体大小应该是 14 而不是 12 时会发生什么?
WPF 引入了样式,这对于 XAML 来说就像 CSS 对于 HTML。使用样式,可以对一组属性进行分组并将它们分配给特定控件或特定类型的所有控件,就像在 CSS 中一样,一个样式可以从另一个样式继承。
来看个示例:
<Window x:Class="WpfAppDATA.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="SimpleStyleSample" Height="200" Width="250">
<StackPanel Margin="10">
<StackPanel.Resources>
<Style TargetType="TextBlock">
<Setter Property="Foreground" Value="Gray" />
<Setter Property="FontSize" Value="24" />
</Style>
</StackPanel.Resources>
<TextBlock>Header 1</TextBlock>
<TextBlock>Header 2</TextBlock>
<TextBlock Foreground="Blue">Header 3</TextBlock>
</StackPanel>
</Window>
示例效果:
对于使用 StackPanel 的资源,我们定义了一个Style。
使用 TargetType 属性告诉 WPF 此样式应应用于范围内的所有 TextBlock 控件(StackPanel),然后向该样式添加两个 Setter 元素。Setter 元素用于设置目标控件的特定属性,在本例中为Foreground和FontSize属性。该物业 属性告诉WPF我们想要的属性定位,和值属性定义所需的值。
请注意,最后一个 TextBlock 是蓝色而不是灰色。这样做是为了更好的展示,虽然控件可能从指定的样式获取样式,但可以完全自由地在控件上本地覆盖它 - 直接在控件上定义的值将始终优先于样式值。
我们使用了一个非常基本的本地定义样式示例,它针对特定类型的控件 - TextBlock。但是,样式可以定义在几个不同的范围内,这取决于我们希望在何处以及如何使用它们,甚至可以将样式限制为仅用于明确需要的控件。