2009-04-30 11 views
18

¿Cómo podría crear un pincel que dibuje una cuadrícula regular y repetida de líneas gruesas de 1 unidad espaciadas uniformemente en los ejes horizontal y vertical? Imagine papel cuadriculado, si quiere.WPF - ¿Cómo puedo hacer un pincel que pinta cuadrados con forma de papel cuadriculado?

Idealmente, la solución permitiría el control sobre los pinceles utilizados para las líneas y el fondo (las regiones dentro de los cuadrados). De esta forma, el fondo podría ser transparente, de modo que la rejilla podría servir como una superposición.

EDITAR Aquí es una imagen que muestra el resultado de la respuesta de Tom continuación:

Para este ejemplo se utilizó una rejilla de material compuesto de tres capas para mostrar que la red es realmente transparente.

Respuesta

25

de 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> 
+0

Gracias por su respuesta, la única que realmente produce una cuadrícula similar a un papel cuadriculado, como se solicitó. –

2

Usa un DrawingBrush. Un Dibujo puede contener formas, imágenes, texto y medios.

El siguiente ejemplo usa un DrawingBrush para pintar el relleno de un rectá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; 

Fuente: MSDN: WPF Brushes Overview

+0

En realidad, esto crea un tablero de ajedrez (por cierto, no te voté). –

+0

por favor! Esto es solo una muestra. – CSharper

2

Usted puede hacer esto en XAML utilizando un VisualBrush. Como muestra para darle un punto de partida, here is a blog post que usa VisualBrush para crear un pincel sombreado. Está muy cerca de una grilla y sería bastante fácil de convertir.

1

utilicé un mapa de bits de 16x16 con los bordes inferiores izquierdo y negro. Luego, en mi ventana, configuré el fondo para usar eso, mosaico. Aquí está el XAML (ligeramente alterado para aparecer).

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

Enfoque interesante. No creo que los archivos .bmp puedan tener canales alfa, por lo que la transparencia demostrada en la pregunta no es posible. Además, no estoy seguro, pero creo que el rendimiento del uso de ImageBrush sería peor que dibujar geometría, ya que crea objetivos intermedios de renderizado que implican mucha copia de memoria. Gracias por la respuesta y (a juzgar por su representante) bienvenidos a Stack Overflow :) –

Cuestiones relacionadas