如果局限于简单的、灰色外观的普通按钮以及其他常用控件,WPF将是没有新意的捆绑。WPF提供了几个特性,允许为基本元素插入一些自己的爱好,并标准化应用程序的可视化外观。本次主要学习样式和行为。样式是组织和重用格式化选项的重要工具。不是使用重复的标记填充XAML,以设置注入外边距、内边距、颜色以及字体等细节,而可以创建一系列封装所有这些细节的;样式。然后可以在需要之处通过一个属性应用样式。行为是一个重用用户界面代码的更有挑战性的工具。其基本思想是行为封装了一些通用的UI功能。如果具有适当的行为,可以使用一两行XAML标记将其附加到一个元素,从而可以为您节省便携盒调试代码的工作。

11.1 样式基础

  样式是可以应用于元素的属性值的集合。WPF样式系统和HTML标记中的层叠样式表标准扮演类似的角色。与CSS类似,通过WPF样式可以定义通用的格式化特性集合,并且为了保证一致性,在整个应用程序中应用它们。与CSS一样,WPF样式也能够自动工作,指定具体的元素类型的目标,并且通过元素树层叠起来。然而,WPF样式的功能更加强大,因为它们能够设置任何依赖项属性。这意味着可以使用它们标准化未格式化的特性,如控件的行为。WPF样式还支持触发器,当一个属性发生变化时可以通过触发器改变控件的样式,并且可以使用模板重新定义控件的内置外观。为了理解适合使用样式的场合,分析一个简单的示例。设想需要标准化在窗口中使用的字体。最简单的方法是设置包含窗口的字体属性。这些属性是在Control类中定义的,得益于这些属性值的继承特性,当在窗口级别上设置这些属性时,在窗口中的所有元素都会使用相同的属性值,除非明确的覆盖它们。现在考虑一种情况,希望只为用户界面中的一部分锁定字体。如果能在一个特定容器中隔离这些元素,可以使用本质上相同的方法,并设置容器的字体属性。如果,我们希望使所有的按钮具有抑制的字体和文本尺寸,并且使用和其他元素不同的字体设置。就需要一种方法在某个地方定义这些细节,并在所有应用它们的地方重用这些细节。如下所示:

  <Window.Resources>    
    <FontFamily x:Key="ButtonFontFamily">Times New Roman</FontFamily>
    <s:Double x:Key="ButtonFontSize">18</s:Double>
    <FontWeight x:Key="ButtonFontWeight">Bold</FontWeight>    
  </Window.Resources>

这是在窗口中定义的资源,一旦定义了资源,下一步是在元素中实际使用这些资源。

    <Button Padding="5" Margin="5"
            FontFamily="{StaticResource ButtonFontFamily}"
            FontWeight="{StaticResource ButtonFontWeight}"
            FontSize="{StaticResource ButtonFontSize}" 
              >A Customized Button</Button>

这种方式虽然将字体细节移除了标记,但还存有问题,1、除恶资源名称相似之外,没有明确指明三个资源是相关的。如果需要设置更多的字体属性,或者决定为不同类型的元素维护不同字体设置,这将变的复杂。2、需要使用资源的标记非常繁琐。我们可以通过定义一个将所有字体捆绑在一起的自定义类。样式对这一问题提供了非常好的解决方案。可以定义一个独立的包装所有希望设置的属性的样式。如下:

  <Window.Resources>
    <Style x:Key="BigFontButtonStyle">
      <Setter Property="Control.FontFamily" Value="Times New Roman" />
      <Setter Property="Control.FontSize" Value="18" />
      <Setter Property="Control.FontWeight" Value="Bold" />
    </Style>    
  </Window.Resources>

上面的标记创建了一个独立的资源:一个System.Windows.Style对象。这个样式对象包含了一个Setter集合,该集合具有三个Setter对象,每个Setter对象用于一个希望设置的属性。每个Setter对象由两部分信息组成:希望进行设置的属性和希望为该属性应用的值。与所有资源一样,样式对象有一个键名,从而当需要时可以从集合中提取它。每个WPF元素都可以使用一个样式,样式通过元素的Style属性插入到元素中。如下,将上面创建的样式配置到一个按钮:

    <Button Padding="5" Margin="5"
            Style="{StaticResource BigFontButtonStyle}" 
              >A Customized Button</Button>

也可以通过代码设置样式。需要做的全部工作就是使用熟悉的FindResource()方法,从最近的资源集合中提取样式。如下:

cmdButton.Style=(Style)cmd.FindResource("样式键名");

Setter集合是Style类中最重要的属性,但并不是唯一的属性,在Style类中共有5个重要属性,如下表中介绍了这些属性

Setters 设置属性值以及自动关联事件处理程序的Setter对象或EventSetter对象的集合
Triggers 继承自TriggerBase类并且能够自动改变样式设置的对象的集合。例如,当另一个属性改变时,或者当发生某个事件时,可以修改样式
Resources 希望用于样式的资源集合。例如,可能需要使用一个对象设置多个属性。这时,作为资源创建对象,然后再在Setter对象中使用该资源,这样会更高效
BasedOn 通过该属性可以创建继承自其他样式设置的更复杂样式
TargetType 该属性表示应用样式的元素的类型。通过该属性可以创建只影响特定类型元素的设置器,并且还可以创建能够为恰当的元素类型自动起作用的设置器

11.1.1 创建样式对象

  如果希望创建具有更精细目标的样式,可以使用容器的Resoures集合定义样式,如StakPanel面板或Grid面板。如果希望在应用程序中重用样式,可以使用应用程序的Resources集合定义样式。严格来讲,不需要同时使用样式和资源。因为无法与其他元素共享该样式,如果只是使用样式设置一些属性,直接设置熟悉更加容易。但是,可以使用该方法为一个元素关联触发器。通过该方法还可以修改元素控件模板的一部分。

11.1.2 设置属性

  每个Style对象包装了一个Setter对象的集合。每个Setter对象设置元素的单个属性。唯一的限制是设置器只能改变依赖项属性——不能修改其他属性。在某些情况下,不能使用简单的特性字符创设置属性值。例如,不能使用简单的字符串创建ImageBrush对象。对于这种情况,可以使用属性的XAML技巧,使用嵌套的元素代替特性。下面是一个示例:

<Style x:key="HappyTiledElementStyle">
    <Setter Property="Control.Background">
        <Setter.Value>
            <ImageBrush TileMode="Tile" ViewportUnits="Absolute" Viewport="0 0 32 32" ImageSoure="happyface.jpg" Opacity="0.3">
            </ImageBrush>
        </Setter.Value>
    </Setter>
</Style>

为了标识希望设置的属性,需要提供类和属性的名称。然而,使用的类名不必是定义属性的类名。也可以是继承了属性的派生类。例如如下样式,该样式使用Button类的引用代替了Control类的引用

    <Style x:Key="BigFontButtonStyle">
      <Setter Property="Control.FontFamily" Value="Times New Roman" />
      <Setter Property="Control.FontSize" Value="18" />
      <Setter Property="Control.FontWeight" Value="Bold" />
    </Style>
View Code

相关文章:

  • 2022-12-23
  • 2021-12-25
  • 2022-01-27
  • 2021-11-16
猜你喜欢
  • 2021-08-23
  • 2022-01-09
  • 2022-12-23
  • 2022-12-23
  • 2021-07-04
相关资源
相似解决方案