WPF 里面做Pattern画刷不像GDI+那么容易,找到一篇歪果仁的文章,转过来大家看看,可以实现,但是确实挺复杂的。
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Page.Resources>
<VisualBrush
x:Key="DotFillBrush"
TileMode="Tile"
Viewport="0,0,10,10"
ViewportUnits="Absolute"
Viewbox="0,0,12,12"
ViewboxUnits="Absolute">
<VisualBrush.Visual>
<Ellipse
Fill="#00C0FF"
Width="10" Height="10" />
</VisualBrush.Visual>
</VisualBrush>
<VisualBrush
x:Key="HatchBrush"
TileMode="Tile" Viewport="0,0,10,10"
ViewportUnits="Absolute" Viewbox="0,0,10,10"
ViewboxUnits="Absolute">
<VisualBrush.Visual>
<Canvas>
<Rectangle Fill="Azure" Width="10" Height="10" />
<Path Stroke="Purple" Data="M 0 0 l 10 10" />
<Path Stroke="Purple" Data="M 0 10 l 10 -10" />
</Canvas>
</VisualBrush.Visual>
</VisualBrush>
</Page.Resources>
<Canvas>
<Rectangle Canvas.Top="20" Canvas.Left="20"
Width="80" Height="40"
Fill="{StaticResource DotFillBrush}"/>
<Rectangle Canvas.Top="20" Canvas.Left="120"
Width="80" Height="40"
Fill="{StaticResource HatchBrush}"/>
<TextBlock Canvas.Top="80" Canvas.Left="20"
Text="Hello" FontSize="80"
Foreground="{StaticResource DotFillBrush}"/>
<TextBlock Canvas.Top="80" Canvas.Left="220"
Text="World" FontSize="80"
Foreground="{StaticResource HatchBrush}"/>
</Canvas>
</Page>
下面是另一个歪果仁把上面的XAML翻译成C#的代码
VisualBrush vb = new VisualBrush();
vb.TileMode = TileMode.Tile;
vb.Viewport = new Rect(0, 0, 10, 10);
vb.ViewportUnits = BrushMappingMode.Absolute;
vb.Viewbox = new Rect(0, 0, 12, 12);
vb.ViewboxUnits = BrushMappingMode.Absolute;
Ellipse ellipse = new Ellipse();
ellipse.Fill = Brushes.Black;
ellipse.Width = 10;
ellipse.Height = 10;
vb.Visual = ellipse;
return vb;
这里我也写了一个函数,做了一个最基本的 hatched brush ,代码和效果如下:
private VisualBrush GetHatchedBrush()
{
Color bgc = Colors.White;
Color fgc = Colors.Gray;
VisualBrush vb = new VisualBrush();
vb.TileMode = TileMode.Tile;
vb.Stretch = Stretch.None;
vb.Viewport = new Rect(0, 0, 25, 25);
vb.ViewportUnits = BrushMappingMode.Absolute;
Canvas cnv = new Canvas();
Rectangle r = new Rectangle();
r.Width = 26; r.Height = 26;
r.Fill = new SolidColorBrush(bgc);
cnv.Children.Add(r);
for(int i = 0; i<5; i++)
{
//left lines
Line l = new Line();
l.X1 = 0; l.Y1 = 5*(i+1); l.X2 = 5 * (i + 1); l.Y2 = 0;
l.Stroke = new SolidColorBrush(fgc);
cnv.Children.Add(l);
//right lines
if (i > 0)//skip longest line in center
{
Line lr = new Line();
lr.X1 = i * 5; lr.Y1 = 25; lr.X2 = 25; lr.Y2 = i * 5;
lr.Stroke = new SolidColorBrush(fgc);
cnv.Children.Add(lr);
}
}
vb.Visual = cnv;
return vb;
}
又简化了一下
private VisualBrush GetHatchedBrush(Brush bg_brsh, Brush fg_brsh)
{
VisualBrush vb = new VisualBrush();
vb.TileMode = TileMode.Tile;
vb.Stretch = Stretch.None;
vb.Viewport = new Rect(0, 0, 5, 5);
vb.ViewportUnits = BrushMappingMode.Absolute;
vb.Viewbox = new Rect(0, 0, 5, 5);
vb.ViewboxUnits = BrushMappingMode.Absolute;
//small rectangle
Canvas cnv = new Canvas();
Rectangle r = new Rectangle();
r.Width = 5; r.Height = 5;
r.Fill = bg_brsh;
r.StrokeThickness = 0;
cnv.Children.Add(r);
//line in rectagle
Line l = new Line();
l.X1 = 0; l.Y1 = 5; l.X2 = 5; l.Y2 = 0;
l.Stroke = fg_brsh;
cnv.Children.Add(l);
vb.Visual = cnv;
return vb;
}