WPF. Как я могу сделать кисть, которая рисует графоподобные квадраты?
Как я могу создать кисть, которая рисует регулярную повторяющуюся сетку с толщиной 1 единицы, равномерно распределенную как по горизонтальной, так и по вертикальной оси? Представьте себе графическую бумагу, если хотите.
В идеале решение позволит контролировать кисти, используемые для линий и фона (области внутри квадратов). Таким образом, фон может быть прозрачным, чтобы сетка могла выступать в качестве наложения.
РЕДАКТИРОВАТЬ Вот изображение, на котором показан результат ответа Тома ниже:
![OE0GL.png]()
В этом примере сетка была использована для создания трех слоев, чтобы показать, что сетка действительно прозрачна.
Ответы
Ответ 1
из 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>
Ответ 2
Используйте DrawingBrush. Чертеж может содержать фигуры, изображения, текст и медиа.
Следующий пример использует DrawingBrush для рисования заливки прямоугольника.
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
Ответ 3
Вы можете сделать это в XAML с помощью VisualBrush. В качестве примера, чтобы дать вам отправную точку, вот сообщение в блоге, которое использует VisualBrush для создания заштрихованной кисти. Это очень близко к сетке - и было бы довольно легко преобразовать.
Ответ 4
Я использовал 16x16 растровое изображение с левым и нижним краями черного цвета. Затем в моем окне я установил фон, чтобы использовать его, черепичный.
Здесь XAML (слегка измененный для отображения).
<Window.Background>
<ImageBrush ImageSource="/GraphPaper;component/Background.bmp"
Stretch="None" TileMode="Tile"
Viewport="0,0,16,16" ViewportUnits="Absolute" />
</Window.Background>