2009-04-30 3 views
18

Как я могу создать кисть, которая рисует правильную повторяющуюся сетку из 1-тонких толстых линий, расположенных равномерно как по горизонтальной, так и по вертикальной оси? Представьте себе графическую бумагу, если хотите.WPF - Как я могу сделать кисть, которая рисует графоподобные квадраты?

В идеале решение позволит контролировать кисти, используемые для линий и фона (области внутри квадратов). Таким образом, фон может быть прозрачным, так что сетка может выступать в качестве наложения.

EDIT Вот изображение, которое показывает результат ответа Тома ниже:

В этом примере сетка была использована для композитных трех слоев, чтобы показать, что сетка является действительно прозрачным.

ответ

25

от 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

Благодарим вас за ответ - единственный, кто действительно создал сетку, подобную графоподобной бумаге, по просьбе. –

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 Brushes Overview

+0

На самом деле это создает контрольную панель (кстати, я не проголосовал за вас). –

+0

Пожалуйста! Это всего лишь образец. – CSharper

2

Вы можете сделать это в XAML, используя VisualBrush. В качестве образца, чтобы дать вам отправную точку, here is a blog post, которая использует VisualBrush для создания вылупившейся кисти. Он очень близок к сетке - и будет довольно легко преобразовать.

1

Я использовал 16x16 растровое изображение с левым и нижними краями черными. Затем в моем окне я установил фон, чтобы использовать его, черепичный. Вот XAML (Немного изменился, чтобы показать).

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

Интересный подход. Я не верю, что файлы .bmp могут иметь альфа-каналы, поэтому прозрачность, продемонстрированная в вопросе, невозможна. Также я не уверен, но я думаю, что производительность использования ImageBrush будет хуже, чем рисование геометрии, поскольку она создает промежуточные объекты рендеринга, которые включают в себя большое количество копий памяти. Спасибо за ответ, и (судя по вашему мнению) добро пожаловать в переполнение стека :) –

Смежные вопросы