WPF - 如何制作一个能够绘制类似图纸一般的正方形的画刷?

21

如何创建一个画一单位宽的定期重复网格线的画笔,使其在水平和垂直轴上间隔均匀,就像图纸一样。

理想情况下,解决方案应该允许对线条和背景(方格内区域)使用的画笔进行控制。这样可以将背景设置为透明,以便该网格可作为覆盖层使用。

编辑以下是Tom所提供答案的结果图:

在这个例子中,使用网格叠加了三个层,以表明网格确实是透明的。

4个回答

28

来自http://msdn.microsoft.com/en-us/library/aa480159.aspx

<DrawingBrush Viewport="0,0,10,10" 
              ViewportUnits="Absolute"
              TileMode="Tile">
  <DrawingBrush.Drawing>
    <DrawingGroup>
      <GeometryDrawing Geometry="M0,0 L1,0 1,0.1, 0,0.1Z" Brush="Green" />
      <GeometryDrawing Geometry="M0,0 L0,1 0.1,1, 0.1,0Z" Brush="Green" />
    </DrawingGroup>
  </DrawingBrush.Drawing>
</DrawingBrush>

感谢您的回答 - 这是唯一一个实际生成像方格纸一样的网格,正如所要求的。 - Drew Noakes

2
使用DrawingBrush。一个Drawing可以包含形状、图像、文本和媒体。
以下示例使用DrawingBrush来填充一个矩形的Fill。
Rectangle exampleRectangle = new Rectangle();
exampleRectangle.Width = 75;
exampleRectangle.Height = 75;

// Create a DrawingBrush and use it to
// paint the rectangle.
DrawingBrush myBrush = new DrawingBrush();

GeometryDrawing backgroundSquare =
    new GeometryDrawing(
        Brushes.White,
        null,
        new RectangleGeometry(new Rect(0, 0, 100, 100)));

GeometryGroup aGeometryGroup = new GeometryGroup();
aGeometryGroup.Children.Add(new RectangleGeometry(new Rect(0, 0, 50, 50)));
aGeometryGroup.Children.Add(new RectangleGeometry(new Rect(50, 50, 50, 50)));

LinearGradientBrush checkerBrush = new LinearGradientBrush();
checkerBrush.GradientStops.Add(new GradientStop(Colors.Black, 0.0));
checkerBrush.GradientStops.Add(new GradientStop(Colors.Gray, 1.0));

GeometryDrawing checkers = new GeometryDrawing(checkerBrush, null, aGeometryGroup);

DrawingGroup checkersDrawingGroup = new DrawingGroup();
checkersDrawingGroup.Children.Add(backgroundSquare);
checkersDrawingGroup.Children.Add(checkers);

myBrush.Drawing = checkersDrawingGroup;
myBrush.Viewport = new Rect(0, 0, 0.25, 0.25);
myBrush.TileMode = TileMode.Tile;

exampleRectangle.Fill = myBrush;

来源: MSDN: WPF画刷概述


实际上,这创建了一个棋盘(顺便说一下,我没有给你投反对票)。 - Drew Noakes
这只是一个示例,请! - M. Jahedbozorgan

2
您可以使用VisualBrush在XAML中实现此功能。以下是一个示例,为您提供一个起点:这篇博客文章使用VisualBrush创建了一种斜纹刷。它非常接近网格 - 并且很容易转换。

1

我使用了一张左下角为黑色的16x16位图。然后在我的窗口中,我将背景设置为平铺该图。

以下是XAML代码(稍作修改以便显示):

<Window.Background>
  <ImageBrush ImageSource="/GraphPaper;component/Background.bmp"
              Stretch="None" TileMode="Tile"
              Viewport="0,0,16,16" ViewportUnits="Absolute" />
</Window.Background>

有趣的方法。我不相信 .bmp 文件可以有 alpha 通道,所以问题中展示的透明度是不可能的。此外,我不确定使用 ImageBrush 的性能是否会比绘制几何图形更差,因为它创建涉及大量内存复制的中间渲染目标。感谢您的回答,并欢迎加入 Stack Overflow :) - Drew Noakes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接