문제

나는 수백 개의 라인을 실시간으로 그릴 것입니다.나는 이것을하기 위해 시각적 계층 을 선택했습니다.그러나 나는 여기에 선을 그릴 수있는 두 가지 다른 방법이 있음을 알 수 있습니다.더 나은 성능과 속도를 얻는 것을 제안하는 것은 무엇입니까?

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))); 
        }
    }
}
.

이는 모든 도면을 호스팅하는 하나의 Speical Visual 또는 요소입니다.

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" ... />
.

100 줄에 100 줄에 100 개의 비주얼을 만드는 대신 상속 할 수있는 Drawingvisual 클래스에 대해 이야기하고있었습니다.

귀하의 질문에 관해서는 첫 번째 접근법이 더 빠릅니다.두 번째 접근 방식은 결국 똑같은 일을하는 것이 멋지게 멋지게하는 것입니다.DrawLine가 가장 낮은 끝입니다.DrawLine보다 더 깊이 갈 수 없습니다.DrawGeometryDrawLine 및 기타 다른 내부 재료를 호출합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top