为了在屏幕上绘制一个图形,WPF需要知道你想要为图形填充什么颜色以及如何绘制它的边框。WPF提 供了一些Brush类型支持各种绘图样式。Pen类增加这些笔刷以提供边框的厚度和样子。
在这一章,我们将要看一下各种类型的笔刷和钢笔类。可是,由于所有的笔刷和钢笔类最终是关于指 出在哪里使用哪一种颜色,以及如何将它们联合在一起,我们必须首先看一下眼色是如何被表示的。
7.3.1 颜色
WPF在System.Windows.Media命名空间中使用了Color结构来表示一种颜色。注意到如果你以往工作于 Windows Forms、ASP.NET或GDI+,Color机构是不同于那些技术使用的机构的——它们使用了 System.Drawing命名空间的Color结构。WPF引进了这种新的Color结构,是因为它可以工作于浮点形式的 颜色值——支持更高的颜色精度,以及更好的弹性。
Color颜色结构使用了四个数字,或者说是通道,来表示一种颜色。这些通道是红、绿、蓝以及Alpha 。红、绿、蓝通道是计算机图形学中传统的表示颜色的方式。(这是因为颜色屏幕通过将这三种基本颜色 混合在一起来工作。)一个0值表示颜色部分完全不存在;三个通道都是0对应黑色。Alpha通道表示颜色 不透明度的等级。Color可以是不透明的、完全不透明的、以及在这两种极限值之间的任意值。WPF的合成 引擎充分支持透明度,因此任何图形都可以被绘制为带有透明等级。0值用来表示完全透明。
Windows是传统的使用24位颜色信息,每个通道8位颜色,以表示“真彩色”;同时还有32位带有透明 度的真彩色。这仅仅是充分的关于计算机屏幕的平均水平。常规计算机表现的颜色和亮度范围是,24位颜 色对于大多数用途总是足够的。然而,对于很多图形化应用程序,这是不够的。例如,电影,相比于计算 机屏幕,可以提供一个更宽范围的亮度,还有24位颜色对于将电影作为输出媒介的图形化工作,是完全不 足够的,同样也不适用于很多医疗影像应用程序。即使对于计算机和视频影像,24位颜色也会引起一些问 题。如果图像需要经过很多阶段的处理,这些增强24位原材料的限制。
WPF因此在它的颜色表示中支持一个相当高等级的细节。每个颜色通道使用16位代替8位。这种Color结 构仍然在需要的地方支持8位通道的使用,因为大多数图像软件依赖于这样的表示。Color通过A、R、G、B 属性暴露了这些8位通道,这些属性接受0到255间的值。这种更高级的定义表示法——通过ScA、ScR、ScG 、ScB属性——也是有效的,这些属性代表了0到1范围内的单精度的浮点值。
ScA、ScR、ScG和ScB属性中的”Sc”涉及了这样的事实,它们支持标准的“Extended RGB colour spacescRGB”,颜色空间定义在IEC61966-2-2规范中。”sc”是“scene”的缩写,因为这通常是一个 scenereferred的颜色空间。这意味着scRGB空间的颜色值代表了原始图像的颜色。这是不同于计算机图像 通常是如何存储的。传统上说,我们已经使用了outputreferred颜色空间,颜色值不需要在显示于目标设 备之前映射到那里。
使用Outputreferred颜色空间可以有效地工作,只要它们恰好设定了输入设备的目标。然而, scenereferred颜色空间保护了所有的可利用信息在捕获或生成图像时。为了更高精度的颜色表示, scenereferred模型因此是更清晰的。即使它们工作起来有点低效率。
这里还有一个Color类,它提供了一组标准的命名颜色,包括所有旧有的喜好,如PapayWhip、 BurlyWood、LightGoldenrodYellow和Brown。
7.3.2 SolidColorBrush
SolidColorBrush是最简单的笔刷。它使用一种颜色给整个区域上色。它只有一个属性,Color。注意 到这个颜色允许使用透明度,尽管在单词中使用了Solid。
我们已经看到广泛使用SolidColorBrush,即使我们并未提供名称涉及它。这是因为WPF创建这种类型 的笔刷,一旦你详细指出了标记中颜色的名称。如果你
大都在标记中工作,你会很少需要指出你需要一个SolidColorBrush,因为你会得到一个默认值。(通 常你会详细指明它以完整的词,唯一的原因是你想使用笔刷属性的数据绑定)。考虑下面这个示例:
<Rectangle Fill=”Yellow” Width=”100” Height=”20” />
xaml编译器会认出Yellow为Color类中一个标准命名的颜色,它会提供一个合适的SolidColorBrush。 (参见附录A获取更多xaml映射字符串到属性值的信息)。这就不需要创建一个笔刷,因为存在一个 Brushes类,在Colors中为每一个命名颜色提供了一组笔刷。