ستريمجيوميتري مقابل دراوينغكونتيكست.خط السحب في وف ج#

StackOverflow https://stackoverflow.com//questions/23021692

سؤال

انا ذاهب الى رسم مئات الخطوط في الوقت الحقيقي.لقد اخترت الطبقة المرئية للقيام بذلك.ولكن أرى أن هناك طريقتين مختلفتين لرسم خط هنا.أي واحد تقترح الحصول على أداء وسرعة أفضل?

1.دراوينغكونتيكست.خط السحب

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.قياس التدفق

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

وهذه هي الطريقة التي يمكنك استخدام كل تلك الأشياء في زمل:

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

كنت أتحدث عن فئة الرسم البصري التي يمكن أن ترث منها بدلا من إنشاء 100 صورة لـ 100 سطر.

فيما يتعلق بسؤالك ، فإن النهج الأول أسرع.لأن النهج الثاني هو في النهاية تفعل الشيء نفسه الأول لا مجرد ملفوفة بشكل جيد. DrawLine هو أدنى نهاية.لا يمكنك الذهاب إلى أي أعمق من DrawLine. DrawGeometry هو الدعوة DrawLine وبعض الأشياء الداخلية الأخرى.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top