Wpf 简明教程

WPF - Styles

NET 框架提供了多种策略,用于个性化和自定义应用程序的外观。通过样式,我们可以灵活地设置对象的某些属性,并在多个对象之间重复使用这些特定设置,以便实现一致的外观。
  1. 在样式中,你只能设置对象的现有属性,例如高度、宽度、字体大小等等。

  2. 只能指定控件的默认行为。

  3. 可以将多个属性添加到单个样式中。

样式用于为一组控件提供统一的外观。隐式样式用于对给定类型的控件的所有控件应用外观,并简化应用程序。设想有三个按钮,它们都必须看起来相同,宽度和高度相同,字体大小相同,前景色相同,等等。我们可以在按钮元素上设置所有这些属性,并且对于所有按钮来说,这仍然完全是可以的。查看以下图表。

styles

但在实际应用程序中,你通常会有更多需要看起来完全相同的控件。当然不只是按钮,你通常会希望你的文本块、文本框和组合框等在整个应用程序中看起来相同。当然,一定有更好的方法来实现这一点,被称为 styling 。可以将样式视为将一组属性值应用到多个元素的便捷方式。查看以下图表。

styles is defined

Example

我们通过一个简单的示例来了解这个概念。首先创建一个新的 WPF 项目。

  1. 将三个按钮从工具箱拖拽到设计窗口。

  2. 以下 XAML 代码创建了三个按钮,并用一些属性初始化它们。

<Window x:Class = "WPFStyle.MainWindow"
   xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"
   xmlns:d = "http://schemas.microsoft.com/expression/blend/2008"
   xmlns:mc = "http://schemas.openxmlformats.org/markup-compatibility/2006"
   xmlns:local = "clr-namespace: WPFStyle"
   mc:Ignorable = "d" Title = "MainWindow" Height = "350" Width = "604">

   <StackPanel>
      <Button Content = "Button1" Height = "30" Width = "80"
         Foreground = "Blue" FontSize = "12" Margin = "10"/>
      <Button Content = "Button2" Height = "30" Width = "80"
         Foreground = "Blue" FontSize = "12" Margin = "10"/>
      <Button Content = "Button3" Height = "30" Width = "80"
         Foreground = "Blue" FontSize = "12" Margin = "10"/>
   </StackPanel>

</Window>

当您查看上面的代码时,您会看到所有按钮的高度、宽度、前景色、字体大小和边距属性均相同。现在,编译并执行上述代码后,将显示以下窗口。

output of three buttons

现在,我们来看同一个示例,但这一次,我们将使用 style

<Window x:Class = "XAMLStyle.MainWindow"
   xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"
   xmlns:d = "http://schemas.microsoft.com/expression/blend/2008"
   xmlns:mc = "http://schemas.openxmlformats.org/markup-compatibility/2006"
   xmlns:local = "clr-namespace:XAMLStyle"
   mc:Ignorable = "d" Title = "MainWindow" Height = "350" Width = "604">

   <Window.Resources>
      <Style x:Key = "myButtonStyle" TargetType = "Button">
         <Setter Property = "Height" Value = "30" />
         <Setter Property = "Width" Value = "80" />
         <Setter Property = "Foreground" Value = "Blue" />
         <Setter Property = "FontSize" Value = "12" />
         <Setter Property = "Margin" Value = "10" />
      </Style>
   </Window.Resources>

   <StackPanel>
      <Button Content = "Button1" Style = "{StaticResource myButtonStyle}" />
      <Button Content = "Button2" Style = "{StaticResource myButtonStyle}" />
      <Button Content = "Button3" Style="{StaticResource myButtonStyle}" />
   </StackPanel>

</Window>

样式在资源字典中定义,每个样式都有一个唯一的键标识符和一个目标类型。在 <style> 内部,您可以看到为将在样式中包含的每个属性定义了多个 setter 标记。

在上例中,每个按钮的所有公共属性现在都在样式中定义,然后通过 StaticResource 标记扩展设置样式属性,将样式分配给具有唯一键的每个按钮。

当您编译并执行上述代码时,它将显示以下窗口(相同的输出)。

output of three buttons

这样做的好处显而易见,我们可以在其作用域内的任何地方重用该样式;如果需要更改它,我们只需在样式定义中更改它一次,而不是在每个元素上更改。

样式定义的级别会立即限制该样式的作用域。因此,作用域(即您可以在其中使用样式的位置)取决于您定义样式的位置。样式可以在以下级别上定义:

Sr.No

Levels & Description

1

Control Level 在控件级别定义样式只能应用于该特定控件。以下是控件级别的示例,其中按钮和 TextBlock 具有自己的样式。

2

Layout Level 在任何布局级别上定义样式将使其仅可由该布局及其子元素访问。

3

Window Level 在窗口级别上定义样式可以使其在该窗口上的所有元素都可以访问。

4

Application Level 在应用程序级别上定义样式可以使其在整个应用程序中都可以访问。让我们举同样的例子,但在这里,我们将样式放在 app.xaml 文件中,以使其在整个应用程序中都可以访问。