2011-06-22 4 views
12

muszę zbudować funkcji linię siatki rysunku na płótnie w WPF:Jak narysować linię siatki na płótnie WPF?

example gridline

void DrawGridLine(double startX, double startY, double stepX, double stepY, 
        double slop, double width, double height) 
{ 
    // How to implement draw gridline here? 
} 

jak pójdę na ten temat?

Odpowiedz

29

Naprawdę nie musisz niczego "rysować" za pomocą WPF. Jeśli chcesz narysować linie, użyj odpowiednich geometrii, aby je narysować.

W twoim przypadku może to być naprawdę proste. Właśnie rysujesz siatkę, więc możesz po prostu utworzyć DrawingBrush, aby narysować pojedynczy kwadrat siatki i ułożyć go, aby wypełnić resztę. Aby narysować twój kafelek, możesz myśleć o tym jak o rysowaniu X-ów. Tak aby mieć 20x10 płytki (co odpowiada stepX i stepY):

(PS, nachylenie slop jest zbędny, ponieważ masz już rozmiary poziome i pionowe krok)

<DrawingBrush x:Key="GridTile" Stretch="None" TileMode="Tile" 
       Viewport="0,0 20,10" ViewportUnits="Absolute"> 
        <!-- ^^^^^^^^^^^ set the size of the tile--> 
    <DrawingBrush.Drawing> 
     <GeometryDrawing> 
      <GeometryDrawing.Geometry> 
       <!-- draw a single X --> 
       <GeometryGroup> 
        <!-- top-left to bottom-right --> 
        <LineGeometry StartPoint="0,0" EndPoint="20,10" /> 

        <!-- bottom-left to top-right --> 
        <LineGeometry StartPoint="0,10" EndPoint="20,0" /> 
       </GeometryGroup> 
      </GeometryDrawing.Geometry> 
      <GeometryDrawing.Pen> 
       <!-- set color and thickness of lines --> 
       <Pen Thickness="1" Brush="Black" /> 
      </GeometryDrawing.Pen> 
     </GeometryDrawing> 
    </DrawingBrush.Drawing> 
</DrawingBrush> 

która dba o rysunku linie. Teraz, aby móc narysować je przesunięte w siatce od krawędzi, musisz mieć kolejną szczotkę, w której narysujesz prostokąt o pożądanych wymiarach, wypełniony twoimi płytkami. Tak aby mieć pozycję wyjściową (30, 45) (odpowiadającej startX i startY) z width i height, 130x120:

<DrawingBrush x:Key="OffsetGrid" Stretch="None" AlignmentX="Left" AlignmentY="Top"> 
    <DrawingBrush.Transform> 
     <!-- set the left and top offsets --> 
     <TranslateTransform X="30" Y="45" /> 
    </DrawingBrush.Transform> 
    <DrawingBrush.Drawing> 
     <GeometryDrawing Brush="{StaticResource GridTile}" > 
      <GeometryDrawing.Geometry> 
       <!-- set the width and height filled with the tile from the origin --> 
       <RectangleGeometry Rect="0,0 130,120" /> 
      </GeometryDrawing.Geometry> 
     </GeometryDrawing> 
    </DrawingBrush.Drawing> 
</DrawingBrush> 

wreszcie go używać, wystarczy ustawić go jako tło swojej sieci (lub innego panelu) :

<Grid Background="{StaticResource OffsetGrid}"> 
    <!-- ... --> 
</Grid> 

Oto jak kończy się patrząc jak:

final look


Jeśli chcesz wygenerować pędzel dynamicznie, tu jest odpowiednikiem funkcji na podstawie powyższej XAML:

static Brush CreateGridBrush(Rect bounds, Size tileSize) 
{ 
    var gridColor = Brushes.Black; 
    var gridThickness = 1.0; 
    var tileRect = new Rect(tileSize); 

    var gridTile = new DrawingBrush 
    { 
     Stretch = Stretch.None, 
     TileMode = TileMode.Tile, 
     Viewport = tileRect, 
     ViewportUnits = BrushMappingMode.Absolute, 
     Drawing = new GeometryDrawing 
     { 
      Pen = new Pen(gridColor, gridThickness), 
      Geometry = new GeometryGroup 
      { 
       Children = new GeometryCollection 
       { 
        new LineGeometry(tileRect.TopLeft, tileRect.BottomRight), 
        new LineGeometry(tileRect.BottomLeft, tileRect.TopRight) 
       } 
      } 
     } 
    }; 

    var offsetGrid = new DrawingBrush 
    { 
     Stretch = Stretch.None, 
     AlignmentX = AlignmentX.Left, 
     AlignmentY = AlignmentY.Top, 
     Transform = new TranslateTransform(bounds.Left, bounds.Top), 
     Drawing = new GeometryDrawing 
     { 
      Geometry = new RectangleGeometry(new Rect(bounds.Size)), 
      Brush = gridTile 
     } 
    }; 

    return offsetGrid; 
} 
+4

wielkie dzięki !!! Twój kod jest doskonały! – Renaud

+0

Ten kod jest absolutnie niesamowity i dziękuję za udostępnienie, ale jeśli chodzi o równoważny kod C# do dynamicznego tworzenia, mam tylko kilka pytań - nie mogę utworzyć pędzla za pomocą tego, ze względu na abstrakcyjne problemy z dziedziczeniem klas. Po prostu ciekawy, w jaki sposób stworzysz tę metodę za pomocą tej metody? – WearyWanderer