【问题标题】:How to draw gridline on WPF Canvas?如何在 WPF Canvas 上绘制网格线?
【发布时间】:2011-06-22 02:36:01
【问题描述】:

我需要在 WPF 的画布上构建一个绘制网格线的函数:

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

我该怎么办?

【问题讨论】:

    标签: c# wpf algorithm draw


    【解决方案1】:

    您实际上不必使用 WPF 来“绘制”任何东西。如果要绘制线条,请使用适当的几何图形来绘制它们。

    在您的情况下,它可能真的很简单。您只是在绘制一个网格,因此您可以创建一个DrawingBrush 来绘制一个网格正方形并将其平铺以填充其余部分。要绘制瓷砖,您可以将其视为绘制 X。所以要有一个20x10 tile(对应于stepXstepY):

    (p.s.,斜率 slop 是多余的,因为您已经有了水平和垂直步长)

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

    它负责绘制线条。现在,为了能够在网格中从边缘偏移绘制它们,您需要使用另一个画笔在其中绘制一个具有所需尺寸的矩形,并用您的瓷砖填充。所以要有(30, 45)的起始位置(对应startXstartY)与widthheight130x120

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

    最后要使用它,只需将其设置为您的网格(或其他面板)的背景:

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

    这是它最终的样子:


    如果要动态生成画笔,这里有一个基于上述 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;
    }
    

    【讨论】:

    • 这段代码非常棒,感谢分享,但至于动态创建它的 c# 等效代码我只是有一些问题 - 我似乎无法使用它创建画笔,因为抽象类继承问题。只是好奇您将如何通过这种方法创建一个?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多