WPF - Como posso fazer um pincel que pinta Graph-paper-like quadrados?
Pergunta
Como se pode criar uma escova que tintas uma grade regular e repetida de linhas grossas 1-unit espaçados uniformemente em ambos os eixos horizontal e vertical? Imagine o papel de gráfico, se você quiser.
Idealmente a solução permitiria o controle sobre as escovas utilizadas para as linhas e o fundo (as regiões dentro dos quadrados). Desta forma, o fundo poderia ser transparente, de modo que a rede poderia servir como uma sobreposição.
Editar Aqui está uma imagem que mostra o resultado da resposta de Tom abaixo:
Para este exemplo uma grade foi usado para compostos de três camadas para mostrar que a grade é verdadeiramente transparente.
Solução
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>
Outras dicas
Use um DrawingBrush. Um desenho pode conter formas, imagens, texto, e meios de comunicação.
O exemplo a seguir usa um DrawingBrush para pintar o preenchimento de um retângulo.
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;
Fonte: MSDN: WPF Brushes Overview
Você pode fazer isso em XAML usando um VisualBrush. Como uma amostra para dar-lhe um ponto de partida, aqui é um post blog que usa VisualBrush para criar um pincel chocado. É muito perto de uma grade -. E seria bastante fácil de se converter em toda
Eu usei um bitmap 16x16 com a esquerda e inferior preto. Então, em minha janela, eu definir o fundo de usar que, lado a lado. Aqui está o XAML (ligeiramente alterada para mostrar-se).
<Window.Background>
<ImageBrush ImageSource="/GraphPaper;component/Background.bmp"
Stretch="None" TileMode="Tile"
Viewport="0,0,16,16" ViewportUnits="Absolute" />
</Window.Background>