0

我正在构建一个可以加载矢量文件并将它们显示在画布上的应用程序。为了有效地缩放和平移,我DrawingVisual为我的背景地图使用了不经常变化的形状。

为了使线条粗细保持不变,无论缩放如何,我都会在Pen.Thickness每个缩放事件中修改 。

这工作正常,但现在我正在尝试为Pen我遇到问题分配颜色。因为所有对象由于厚度/缩放原因共享相同Pen,所以我不知道如何为不同的对象分配不同的颜色。通过共享相同Pen,每个对象都被迫具有相同的颜色。

如何确保所有形状在缩放事件后接收厚度更新,但每个对象具有唯一的颜色?如果我需要Pen为每种颜色使用不同的笔,则无法知道我需要多少支笔。

我的代码如下:

Pen myPen = new Pen();

这是我产生折线的方法:

private DrawingVisual CreatePolyline(PointCollection points, Brush colour)
{
    DrawingVisual drawingVisual = new DrawingVisual();
    DrawingContext drawingContext = drawingVisual.RenderOpen();

    myPen.Thickness = 0.5 / Coords.zoom;
    myPen.Brush = colour;

    var geometry = new StreamGeometry();
    using (StreamGeometryContext ctx = geometry.Open())
    {
        ctx.BeginFigure(points[0], false, false);
        List<Point> _points = points.Skip(1).ToList();
        ctx.PolyLineTo(_points, true, false);
    }

    geometry.Freeze();
    drawingContext.DrawGeometry(null, myPen, geometry);
    drawingContext.Close();

    return drawingVisual;
}

每次缩放时都会触发此方法

public void Handle(ZoomEvent zoomEvent)
{
    myPen.Thickness = 0.5 / zoomEvent.Zoom;
}

这是一种根据它所属的文件、图层、项目本身和任何覆盖用户的选择来分配颜色的方法。

private void UpdateVisualColection()
{
    visualCollection.Clear();
    foreach (MapReference reference in backgroundMaps.References)
    {
        if (reference.IsVisible == true)
        {
            foreach (ReferenceLayer layer in reference.Layers)
            {
                if (layer.IsVisible == true)
                {
                    foreach (SingleItem item in layer.SingleItems)
                    {
                        System.Windows.Media.Color colour;

                        if (reference.ColourOveride == true)
                        {
                            colour = reference.Colour;
                        }
                        else if (item.ColourByLayer == true || layer.ColourOveride == true)
                        {
                            colour = layer.Colour;
                        }
                        else
                        {
                            colour = item.ColourOveride;
                        }
                        var Brush = new SolidColorBrush(Color.FromArgb(255, colour.R, colour.G, colour.B));
                        visualCollection.Add(CreatePolyline(item.Points, Brush));
                    }

                }

            }

        }
    }
}
4

0 回答 0