ستريمجيوميتري مقابل دراوينغكونتيكست.خط السحب في وف ج#
-
21-12-2019 - |
سؤال
انا ذاهب الى رسم مئات الخطوط في الوقت الحقيقي.لقد اخترت الطبقة المرئية للقيام بذلك.ولكن أرى أن هناك طريقتين مختلفتين لرسم خط هنا.أي واحد تقترح الحصول على أداء وسرعة أفضل?
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
وبعض الأشياء الداخلية الأخرى.