2009-04-30 1 views
18

Come posso creare un pennello che dipinga una griglia regolare e ripetuta di linee spesse di 1 unità distanziate uniformemente negli assi orizzontale e verticale? Immagina la carta millimetrata, se vuoi.WPF - Come posso creare un pennello che dipinge quadrati simili a quelli di una carta da grafico?

Idealmente la soluzione consentirebbe il controllo sui pennelli utilizzati per le linee e lo sfondo (le regioni all'interno dei quadrati). In questo modo lo sfondo potrebbe essere trasparente, in modo che la griglia possa fungere da sovrapposizione.

EDIT Ecco un'immagine che mostra il risultato della risposta di Tom seguito:

Per questo esempio una griglia è stato usato per compositi tre strati per dimostrare che la griglia è veramente trasparente.

risposta

25

da 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

Grazie per la risposta, l'unico a produrre una griglia simile a una carta millimetrata, come richiesto. –

2

Utilizzare un DrawingBrush. Un disegno può contenere forme, immagini, testo e media.

L'esempio seguente utilizza un DrawingBrush per disegnare il riempimento di un rettangolo.

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

+0

In realtà questo crea una scacchiera (btw non ho votato in basso). –

+0

Per favore! Questo è solo un esempio. – CSharper

2

È possibile farlo in XAML utilizzando un VisualBrush. Come esempio per darti un punto di partenza, here is a blog post che utilizza VisualBrush per creare un pennello tratteggiato. È molto vicino a una griglia e sarebbe abbastanza facile da convertire.

1

ho usato una bitmap 16x16 con la sinistra e inferiore nera. Poi nella mia finestra, ho impostato lo sfondo per usarlo, affiancato. Ecco la XAML (leggermente modificata per essere visualizzata).

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

Approccio interessante. Non credo che i file .bmp possano avere canali alfa, quindi la trasparenza dimostrata nella domanda non è possibile. Inoltre non ne sono sicuro, ma penso che le prestazioni dell'utilizzo di ImageBrush siano peggiori del disegnare la geometria poiché crea target di rendering intermedi che implicano molta copia della memoria. Grazie per la risposta, e (a giudicare dal tuo rappresentante) benvenuti a Stack Overflow :) –