WPF Hatch 笔刷

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;
        }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值