WPF - Bagaimana cara membuat kuas yang melukis kotak seperti kertas grafik?

Bagaimana cara membuat kuas yang melukis kisi-kisi garis tebal 1 unit yang teratur dan berulang-ulang dengan jarak yang merata pada sumbu horizontal dan vertikal? Bayangkan kertas grafik, jika Anda mau.

Idealnya solusi ini akan memungkinkan kontrol atas kuas yang digunakan untuk garis dan latar belakang (daerah di dalam kotak). Dengan cara ini latar belakangnya bisa transparan, sehingga grid bisa berfungsi sebagai overlay.

EDIT Berikut adalah gambar yang menunjukkan hasil jawaban Tom di bawah ini:

Untuk contoh ini, sebuah grid digunakan untuk menggabungkan tiga lapisan untuk menunjukkan bahwa grid tersebut benar-benar transparan.


person Drew Noakes    schedule 30.04.2009    source sumber


Jawaban (4)


dari 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>
person Thomas    schedule 30.04.2009
comment
Terima kasih atas jawaban Anda -- satu-satunya jawaban yang benar-benar menghasilkan kisi-kisi seperti kertas grafik, seperti yang diminta. - person Drew Noakes; 01.05.2009

Gunakan Kuas Gambar. Gambar dapat berisi bentuk, gambar, teks, dan media.

Contoh berikut menggunakan DrawingBrush untuk melukis Isi Persegi Panjang.

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;

Sumber: MSDN: Ikhtisar Kuas WPF

person CSharper    schedule 30.04.2009
comment
Sebenarnya ini menciptakan papan pemeriksa (tapi saya tidak memilih Anda). - person Drew Noakes; 30.04.2009
comment
Silakan! Ini hanya contoh. - person CSharper; 30.04.2009

Anda dapat melakukan ini di XAML menggunakan VisualBrush. Sebagai contoh untuk memberi Anda titik awal, inilah postingan blog yang menggunakan VisualBrush untuk membuat kuas yang diarsir. Ini sangat dekat dengan grid - dan akan cukup mudah untuk dikonversi.

person Reed Copsey    schedule 30.04.2009

Saya menggunakan bitmap 16x16 dengan tepi kiri dan bawah berwarna hitam. Kemudian di jendela saya, saya mengatur latar belakang untuk menggunakannya, ubin. Inilah XAMLnya (Sedikit diubah agar muncul).

<Window.Background>
  <ImageBrush ImageSource="/GraphPaper;component/Background.bmp"
              Stretch="None" TileMode="Tile"
              Viewport="0,0,16,16" ViewportUnits="Absolute" />
</Window.Background>
person Community    schedule 12.02.2010
comment
Pendekatan yang menarik. Saya tidak percaya file .bmp dapat memiliki saluran alfa, sehingga transparansi yang ditunjukkan dalam pertanyaan tidak dimungkinkan. Saya juga tidak yakin, tapi menurut saya kinerja menggunakan ImageBrush akan lebih buruk daripada menggambar geometri karena ini menciptakan target render perantara yang melibatkan banyak penyalinan memori. Terima kasih atas jawabannya, dan (dilihat dari perwakilan Anda) selamat datang di Stack Overflow :) - person Drew Noakes; 14.02.2010