尝试学习DrawingVisual和StreamGeometry
本文关键字:StreamGeometry DrawingVisual 学习 | 更新日期: 2023-09-27 18:21:36
在我的应用程序中,我必须画一条包含很多点的线(如果需要,最多100000点)。最初我使用了多段线,但对于大量的点来说,这太慢了。
我一直在读一些书,后来学习了DrawingVisual和StreamGeometry,但它不起作用。
我遵循了一个简单的教程,创建了以下类:
class ConcentratieGrafiek : FrameworkElement
{
VisualCollection Visuals;
PointCollection PuntenCollectie;
public ConcentratieGrafiek(PointCollection Punten)
{
Visuals = new VisualCollection(this);
PuntenCollectie = Punten;
this.Loaded += new RoutedEventHandler(ConcentratieGrafiekLoaded);
}
void ConcentratieGrafiekLoaded(object sender, RoutedEventArgs e)
{
DrawingVisual Visual = new DrawingVisual();
StreamGeometry g = new StreamGeometry();
using (StreamGeometryContext cr = g.Open())
{
foreach (Point Punt in PuntenCollectie)
{
if (PuntenCollectie.IndexOf(Punt).Equals(0))
{
cr.BeginFigure(Punt, false, false);
}
else
{
cr.LineTo(Punt, false, false);
}
}
}
using (DrawingContext dc = Visual.RenderOpen())
{
Pen p = new Pen(Brushes.Black, 1);
dc.DrawGeometry(Brushes.Black, p, g);
}
Visuals.Add(Visual);
}
protected override Visual GetVisualChild(int index)
{
return Visuals[index];
}
protected override int VisualChildrenCount
{
get
{
return Visuals.Count;
}
}
}
我需要的所有点都在名为Punten的PointCollection中。然后,我尝试使用将此FrameworkElement添加到画布中。
ActieveCanvas.Children.Add(new ConcentratieGrafiek(ConcentratiePunten) { HorizontalAlignment = HorizontalAlignment.Stretch, VerticalAlignment = VerticalAlignment.Stretch });
其中"ActieveCanvas"是画布。
仅供参考:所有点都是画布内(相对于画布)的X、Y坐标。
我做错了什么?
通过更改以下修复了它
if (PuntenCollectie.IndexOf(Punt).Equals(0))
{
cr.BeginFigure(Punt, false, false);
}
else
{
cr.LineTo(Punt, false, false);
}
至
if (PuntenCollectie.IndexOf(Punt).Equals(0))
{
cr.BeginFigure(Punt, true, false);
}
else
{
cr.LineTo(Punt, true, false);
}