STRAIGGEMOTRY VS DrawingContext.DrawLine WPF C #
-
21-12-2019 - |
문제
나는 수백 개의 라인을 실시간으로 그릴 것입니다.나는 이것을하기 위해 시각적 계층 을 선택했습니다.그러나 나는 여기에 선을 그릴 수있는 두 가지 다른 방법이 있음을 알 수 있습니다.더 나은 성능과 속도를 얻는 것을 제안하는 것은 무엇입니까?
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
보다 더 깊이 갈 수 없습니다.DrawGeometry
는 DrawLine
및 기타 다른 내부 재료를 호출합니다.
제휴하지 않습니다 StackOverflow