从图中可以看出各个画刷之间的继承关系。有7种画刷。
SolidColorBrush单色填充指定区域, LinearGradientBrush线性梯度画刷,RadialGradientBrush圆形梯度画刷,DrawingBrush是图画绘制画刷(包括矢量图和位图),ImageBrush是使用图像做画刷,而VisualBrush是以可视化的控件作为画刷。BitmapCacheBrush 使用缓存内容进行区域描绘。BitmapCacheBrush类似于VisualBrush。 某些情况我们可以使用BitmapCacheBrush来代替VisualBrush。
- SolidColorBrush
<Rectangle Fill="Red" Margin="232,145,235,145" />
<Button x:Name="button" Background="Yellow" Content="Button" Margin="222,180,221,110"/>
其实这里的Background="Yellow"和Fill="Red"使用的就是SolidColorBrush,xaml进行解析时,发现Background或Fill是Brush类型,Brush具有图形转换的能力,最后xaml就会通过Transform把"Red"字符串解析成SolidColorBrush。
- LinearGradientBrush
默认的线性梯度是对角的。默认情况下,线性渐变的起始点为(0,0),该区域的左上角正在绘制,其端点为(1,1),该区域的右下角正在绘制。结果渐变中的颜色沿对角线路径插值。
1.
<Rectangle Width="200" Height="100">
<Rectangle.Fill>
<LinearGradientBrush StartPoint="0,0" EndPoint="1,1">
<GradientStop Color="Yellow" Offset="0.0" />
<GradientStop Color="Red" Offset="0.25" />
<GradientStop Color="Blue" Offset="0.75" />
<GradientStop Color="LimeGreen" Offset="1.0" />
</LinearGradientBrush>
</Rectangle.Fill>
</Rectangle>
2.
<Rectangle Width="200" Height="100">
<Rectangle.Fill>
<LinearGradientBrush StartPoint="0,1" EndPoint="0,0">
<GradientStop Color="Yellow" Offset="0.0" />
<GradientStop Color="Red" Offset="0.25" />
<GradientStop Color="Blue" Offset="0.75" />
<GradientStop Color="LimeGreen" Offset="1.0" />
</LinearGradientBrush>
</Rectangle.Fill>
</Rectangle>
- RadialGradientBrush
<Rectangle Width="200" Height="100">
<Rectangle.Fill>
<RadialGradientBrush GradientOrigin="0.5,0.5" Center="0.5,0.5"
RadiusX="0.5" RadiusY="0.5">
<GradientStop Color="Yellow" Offset="0" />
<GradientStop Color="Red" Offset="0.25" />
<GradientStop Color="Blue" Offset="0.75" />
<GradientStop Color="LimeGreen" Offset="1" />
</RadialGradientBrush>
</Rectangle.Fill>
</Rectangle>
- DrawingBrush
<Button Content="A Button" Width="70" Height="70">
<Button.Background>
<DrawingBrush>
<DrawingBrush.Drawing>
<GeometryDrawing Brush="LightBlue">
<GeometryDrawing.Geometry>
<GeometryGroup>
<EllipseGeometry RadiusX="12.5" RadiusY="25" Center="25,50" />
<EllipseGeometry RadiusX="12.5" RadiusY="25" Center="50,50" />
<EllipseGeometry RadiusX="12.5" RadiusY="25" Center="75,50" />
</GeometryGroup>
</GeometryDrawing.Geometry>
<GeometryDrawing.Pen>
<Pen Thickness="1" Brush="Gray" />
</GeometryDrawing.Pen>
</GeometryDrawing>
</DrawingBrush.Drawing>
</DrawingBrush>
</Button.Background>
</Button>
- ImageBrush
<StackPanel>
<Canvas Height="200" Width="300">
<Canvas.Background>
<ImageBrush ImageSource="tp.jpg" />
</Canvas.Background>
</Canvas>
</StackPanel>
- VisualBrush和BitmapCacheBrush
这种画刷是作用在控件级别上的,也就是说任何控件都可以作为画刷
<StackPanel Orientation="Vertical">
<Rectangle Width="100" Height="25" Margin="10">
<Rectangle.Fill>
<VisualBrush>
<VisualBrush.Visual>
<StackPanel Orientation="Horizontal">
<TextBlock Text="Hello world!"/>
<Button Content="Button"/>
</StackPanel>
</VisualBrush.Visual>
</VisualBrush>
</Rectangle.Fill>
</Rectangle>
<Rectangle Width="100" Height="25" Margin="10">
<Rectangle.Fill>
<BitmapCacheBrush>
<BitmapCacheBrush.Target>
<StackPanel Orientation="Horizontal">
<TextBlock Text="Hello world!"/>
<Button Content="Button"/>
</StackPanel>
</BitmapCacheBrush.Target>
<BitmapCacheBrush.BitmapCache>
<BitmapCache SnapsToDevicePixels="True" RenderAtScale="1"/>
</BitmapCacheBrush.BitmapCache>
</BitmapCacheBrush>
</Rectangle.Fill>
</Rectangle>
</StackPanel>
RenderAtScale 属性见:
但是,BitmapCacheBrush总是从一个目标元素的缓存或者通过BitmapCache 属性定义的缓存来渲染并且BitmapCacheBrush类忽略以下位于根Visual的属性: VisualOffset,VisualTransform,VisualClip,VisualEffect,VisualOpacity,VisualOpacity。这种行为有别于VisualBrush类。