2009-04-30 6 views
18

Comment est-ce que je pourrais créer une brosse qui dessine une grille régulière et répétée de lignes épaisses de 1 unité espacées uniformément dans les axes horizontaux et verticaux? Imaginez un papier millimétré, si vous voulez.WPF - Comment faire un pinceau pour peindre des carrés de papier graphique?

Idéalement, la solution permettrait de contrôler les balais utilisés pour les lignes et le fond (les régions dans les carrés). De cette façon, l'arrière-plan pourrait être transparent, de sorte que la grille pourrait servir de superposition.

EDIT Voici une image qui montre le résultat de la réponse de Tom ci-dessous: pour montrer que la grille est vraiment transparente

Pour cet exemple, une grille a été utilisé pour composites à trois couches.

Répondre

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

Merci pour votre réponse - la seule à produire une grille de type papier graphique, comme demandé. –

2

Utilisez un DrawingBrush. Un dessin peut contenir des formes, des images, du texte et des médias.

L'exemple suivant utilise un DrawingBrush pour peindre le remplissage d'un rectangle.

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; 

Source: MSDN: WPF Brushes Overview

+0

En fait, cela crée un tableau de contrôle (par ailleurs je ne vous ai pas voté). –

+0

S'il vous plaît! Ceci est juste un échantillon. – CSharper

2

Vous pouvez le faire en XAML en utilisant un VisualBrush. Comme un exemple pour vous donner un point de départ, here is a blog post qui utilise VisualBrush pour créer un pinceau hachuré. Il est très proche d'une grille - et serait assez facile à convertir.

1

I utilisé un bitmap 16x16 avec les bords gauche et fond noir. Puis dans ma fenêtre, j'ai mis l'arrière-plan pour l'utiliser, en mosaïque. Voici le XAML (légèrement modifié pour apparaître).

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

Approche intéressante. Je ne crois pas que les fichiers .bmp peuvent avoir des canaux alpha, donc la transparence démontrée dans la question n'est pas possible. Aussi, je ne suis pas certain, mais je pense que la performance de l'utilisation d'un ImageBrush serait pire que la géométrie de dessin car il crée des cibles de rendu intermédiaires qui impliquent beaucoup de copie de la mémoire. Merci pour la réponse, et (à en juger par votre représentant) bienvenue à Stack Overflow :) –

Questions connexes