C# WPF C中的StreamGeometry与DrawingContext.DrawLine#
我将实时绘制数百条线。我选择了视觉层来执行此操作。但我看到这里有两种不同的方式来划分界限。您建议哪一个可以获得更好的性能和速度 1。DrawingContext.DrawLineC# WPF C中的StreamGeometry与DrawingContext.DrawLine#,c#,wpf,performance,line,drawingcontext,C#,Wpf,Performance,Line,Drawingcontext,我将实时绘制数百条线。我选择了视觉层来执行此操作。但我看到这里有两种不同的方式来划分界限。您建议哪一个可以获得更好的性能和速度 1。DrawingContext.DrawLine public class DrawingTypeOne : FrameworkElement { private readonly VisualCollection _visuals; public DrawingTypeOne(double thickness) { var m
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)));
}
}
}
这是一个承载所有图形的特定视觉或元素:
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" ... />
我说的是DrawingVisual类,您可以从中继承,而不是为100行创建100个视觉效果
关于你的问题,第一种方法更快。因为第二种方法最终也是这样做的,所以第一种方法只是很好地包装了它<代码>抽绳是最下端。你不能走得比画线更深
DrawGeometry
正在调用DrawLine
和其他一些内部内容。为什么不尝试这两种方法并回答您自己的问题?将控件的内容设置为来源于StreamGeometry的PathFigure如何?@Vahid是的,理论上,它比路径信息轻,因为它不支持某些相同的功能集。@是的,批处理绘图应该会有帮助。一般来说,在WPF中绘制几百条线是非常容易的,但是,无论您如何绘制,adn都不会成为问题。除非这是个问题,否则我不会把太多精力放在优化它上。如果你想提高性能,不要用100行创建100个视觉效果。只需创建一个视觉效果,并在其中绘制100条线。WPF将缓存图形,因此不需要从FrameworkElement继承。此外,这是如何让你有一个视觉没有措施和安排的支持,也将节省你很多时间。事实上,我正在做如上所述。我的循环使用在中运行。不继承FrameworkElement
怎么样?我读到我也可以继承UIElement
。顺便问一下,你能在StreamGeometry
vsDrawingContext.drawine
上附加你的评论吗。它在注释中丢失。在代码中有一行:\u visuals.Add(drawingVisual)代码>在我看来,您将每一行添加到VisualCollection。然后您可以使用\u visuals[index]访问它们代码>不需要100个绘图图像,您只需要一个即可。:)是的,您可以从UIElement甚至Visual继承。您所需要的是一个主机和一个可视化的所有图形。网格、StackPanel和Canvas可以是您的所有主机。在WPF中,一切都是视觉的。永远不要声称这是一个错误。作为功能出售。