WPF - ฉันจะสร้างแปรงที่วาดสี่เหลี่ยมคล้ายกระดาษกราฟได้อย่างไร

ฉันจะสร้างแปรงที่ทาสีตารางซ้ำๆ เป็นประจำซึ่งมีเส้นหนา 1 หน่วยโดยเว้นระยะห่างเท่าๆ กันทั้งในแกนแนวนอนและแนวตั้งได้อย่างไร ลองนึกภาพกระดาษกราฟถ้าคุณต้องการ

ตามหลักการแล้ว วิธีแก้ปัญหาจะช่วยให้สามารถควบคุมแปรงที่ใช้สำหรับเส้นและพื้นหลัง (บริเวณภายในสี่เหลี่ยม) ด้วยวิธีนี้ พื้นหลังจึงสามารถโปร่งใส เพื่อให้ตารางสามารถใช้เป็นภาพซ้อนทับได้

แก้ไข นี่คือภาพที่แสดงผลคำตอบของ Tom ด้านล่าง:

สำหรับตัวอย่างนี้ มีการใช้ตารางเพื่อรวมสามชั้นเข้าด้วยกันเพื่อแสดงว่าตารางมีความโปร่งใสอย่างแท้จริง


person Drew Noakes    schedule 30.04.2009    source แหล่งที่มา


คำตอบ (4)


จาก 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
ขอบคุณสำหรับคำตอบของคุณ - เป็นเพียงคนเดียวที่สร้างตารางเหมือนกระดาษกราฟตามที่ขอ - person Drew Noakes; 01.05.2009

ใช้แปรงวาดภาพ รูปวาดสามารถมีรูปร่าง รูปภาพ ข้อความ และสื่อได้

ตัวอย่างต่อไปนี้ใช้ 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

person CSharper    schedule 30.04.2009
comment
จริงๆ แล้วนี่เป็นการสร้างกระดานหมากรุก (แต่ฉันไม่ได้ลงคะแนนให้คุณ) - person Drew Noakes; 30.04.2009
comment
โปรด! นี่เป็นเพียงตัวอย่างเท่านั้น - person CSharper; 30.04.2009

คุณสามารถทำได้ใน XAML โดยใช้ VisualBrush เป็นตัวอย่างเพื่อเป็นจุดเริ่มต้น นี่คือโพสต์บล็อกที่ใช้ VisualBrush เพื่อสร้างแปรงฟัก มันอยู่ใกล้กับตารางมาก - และจะค่อนข้างง่ายที่จะแปลงข้าม

person Reed Copsey    schedule 30.04.2009

ฉันใช้บิตแมป 16x16 โดยมีขอบด้านซ้ายและด้านล่างเป็นสีดำ จากนั้นในหน้าต่างของฉัน ฉันตั้งค่าพื้นหลังเพื่อใช้สิ่งนั้นแบบเรียงต่อกัน นี่คือ XAML (เปลี่ยนแปลงเล็กน้อยเพื่อให้ปรากฏขึ้น)

<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
แนวทางที่น่าสนใจ ฉันไม่เชื่อว่าไฟล์ .bmp สามารถมีช่องอัลฟาได้ ดังนั้นจึงเป็นไปไม่ได้ที่จะแสดงความโปร่งใสในคำถาม นอกจากนี้ฉันยังไม่แน่ใจ แต่ฉันคิดว่าประสิทธิภาพของการใช้ ImageBrush จะแย่กว่าการวาดรูปทรงเรขาคณิตเนื่องจากสร้างเป้าหมายการเรนเดอร์ระดับกลางที่เกี่ยวข้องกับการคัดลอกหน่วยความจำจำนวนมาก ขอบคุณสำหรับคำตอบ และ (ตัดสินโดยตัวแทนของคุณ) ยินดีต้อนรับสู่ Stack Overflow :) - person Drew Noakes; 14.02.2010