C# WPF C中的StreamGeometry与DrawingContext.DrawLine#

C# WPF C中的StreamGeometry与DrawingContext.DrawLine#,c#,wpf,performance,line,drawingcontext,C#,Wpf,Performance,Line,Drawingcontext,我将实时绘制数百条线。我选择了视觉层来执行此操作。但我看到这里有两种不同的方式来划分界限。您建议哪一个可以获得更好的性能和速度 1。DrawingContext.DrawLine public class DrawingTypeOne : FrameworkElement { private readonly VisualCollection _visuals; public DrawingTypeOne(double thickness) { var m

我将实时绘制数百条线。我选择了视觉层来执行此操作。但我看到这里有两种不同的方式来划分界限。您建议哪一个可以获得更好的性能和速度

1。DrawingContext.DrawLine

public class DrawingTypeOne : FrameworkElement
{
    private readonly VisualCollection _visuals;
    public DrawingTypeOne(double thickness)
    {
        var myPen = new Pen
        {
            Thickness = 1,
            Brush = Brushes.White,
        };
        myPen.Freeze();

        _visuals = new VisualCollection(this);
        var drawingVisual = new DrawingVisual();
        using (var dc = drawingVisual.RenderOpen())
        {
            dc.DrawLine(myPen, new Point(0,0) , new Point(100,100));
            _visuals.Add(drawingVisual);
        }
    }

    protected override Visual GetVisualChild(int index)
    {
        return _visuals[index];
    }

    protected override int VisualChildrenCount
    {
        get
        {
            return _visuals.Count;
        }
    }
}
2。StreamGeometry

public class DrawingTypeTwo : FrameworkElement
{
    private readonly VisualCollection _visuals;
    public DrawingTypeTwo()
    {
        _visuals = new VisualCollection(this);

        var geometry = new StreamGeometry();
        using (var gc = geometry.Open())
        {
            gc.BeginFigure(new Point(0, 0), true, true);
            gc.LineTo(new Point(100,100), true, false);
        }
        geometry.Freeze();

        var drawingVisual = new DrawingVisual();
        using (var dc = drawingVisual.RenderOpen())
        {
            dc.DrawGeometry(Brushes.Red, null, geometry);
        }

        _visuals.Add(drawingVisual);
    }

    protected override Visual GetVisualChild(int index)
    {
        return _visuals[index];
    }

    protected override int VisualChildrenCount
    {
        get
        {
            return _visuals.Count;
        }
    }
}

就像我说的,你只需要一个视觉效果,在里面你可以看到你所有的线条

看看这个:

首先,我们在图形上下文中定义多个图形:

class EllipseAndRectangle : DrawingVisual
{
    public EllipseAndRectangle()
    {
        using (DrawingContext dc = RenderOpen())
        {
            // Black ellipse with blue border
            dc.DrawEllipse(Brushes.Black,
                new Pen(Brushes.Blue, 3),        
                new Point(120, 120), 20, 40); 

            // Red rectangle with green border
            dc.DrawRectangle(Brushes.Red,
                new Pen(Brushes.Green, 4),    
                new Rect(new Point(10, 10), new Point(80, 80))); 
        }
    }
}
这是一个承载所有图形的特定视觉或元素:

public class EllAndRectHost : FrameworkElement
{
    private EllipseAndRectangle _ellAndRect = new EllipseAndRectangle();

    // EllipseAndRectangle instance is our only visual child
    protected override Visual GetVisualChild(int index)
    {
        return _ellAndRect;
    }

    protected override int VisualChildrenCount
    {
        get
        {
            return 1;
        }
    }
}
这就是如何在XAML中使用所有这些东西:

<local:EllAndRectHost Margin="30" ... />

我说的是DrawingVisual类,您可以从中继承,而不是为100行创建100个视觉效果


关于你的问题,第一种方法更快。因为第二种方法最终也是这样做的,所以第一种方法只是很好地包装了它<代码>抽绳是最下端。你不能走得比画线更深
DrawGeometry
正在调用
DrawLine
和其他一些内部内容。

为什么不尝试这两种方法并回答您自己的问题?将控件的内容设置为来源于StreamGeometry的PathFigure如何?@Vahid是的,理论上,它比路径信息轻,因为它不支持某些相同的功能集。@是的,批处理绘图应该会有帮助。一般来说,在WPF中绘制几百条线是非常容易的,但是,无论您如何绘制,adn都不会成为问题。除非这是个问题,否则我不会把太多精力放在优化它上。如果你想提高性能,不要用100行创建100个视觉效果。只需创建一个视觉效果,并在其中绘制100条线。WPF将缓存图形,因此不需要从FrameworkElement继承。此外,这是如何让你有一个视觉没有措施和安排的支持,也将节省你很多时间。事实上,我正在做如上所述。我的循环使用在
中运行。不继承
FrameworkElement
怎么样?我读到我也可以继承
UIElement
。顺便问一下,你能在
StreamGeometry
vs
DrawingContext.drawine
上附加你的评论吗。它在注释中丢失。在代码中有一行:
\u visuals.Add(drawingVisual)在我看来,您将每一行添加到VisualCollection。然后您可以使用
\u visuals[index]访问它们不需要100个绘图图像,您只需要一个即可。:)是的,您可以从UIElement甚至Visual继承。您所需要的是一个主机和一个可视化的所有图形。网格、StackPanel和Canvas可以是您的所有主机。在WPF中,一切都是视觉的。永远不要声称这是一个错误。作为功能出售。