C# WPF drawLine 大量线段的绘制
2013-04-16 16:05
513 查看
在WPF中绘制大量数量的线段时,绘制很慢,而且很耗CPU的资源。绘制到几百条线段时,就会明显无法交互操作。
通过查询资料,我们找到一个方法可以解决:使用StreamGeometry在内存中绘制,然后再Render到WPF的控件上。
实现如下:
using (var geometryContext = _cueGeometry.Open())
using (var perContext = _perGeometry.Open())
using (var _volContext = _volGeometry.Open())
{
for (int i = 0; i < TickLineValue.drawTickData.Count() - 1; i++)
{
TickLineValue.drawTickData[i].picTopY = topY;
TickLineValue.drawTickData[i].PriceMax = TickLineValue.tickMaxValue;
TickLineValue.drawTickData[i].PriceMin = TickLineValue.tickMinValue;
TickLineValue.drawTickData[i].ScreenTickHeight = TickLineValue.tickHeight;
TickLineValue.drawTickData[i].VolMax = TickLineValue.volMaxValue;
TickLineValue.drawTickData[i].picVolTopY = TickLineValue.lineObject.GetYValue() + TickLineValue.perPicTxtHeight;
TickLineValue.drawTickData[i].ScreenVolHeight = TickLineValue.volHeight;
//绘制图形的
x = TickLineValue.picLeftWidth + i * TickLineValue.picWidth;
//绘制tick
Point p0 = new Point();
p0.X = x;
p0.Y = TickLineValue.drawTickData[i].newPriceY;
if (i == 0)
{
geometryContext.BeginFigure(p0, true, false);
}
else
{
geometryContext.LineTo(p0, true, true);
}
//绘制均线
p0.Y = TickLineValue.drawTickData[i].perPriceY;
if (i == 0)
{
perContext.BeginFigure(p0, true, false);
}
else
{
perContext.LineTo(p0, true, true);
}
////绘制交易量
p0.Y = TickLineValue.drawTickData[i].tradeVolY;
Point p1 = new Point();
p1.X = x;
p1.Y = volY;
_volContext.BeginFigure(p0, true, false);
_volContext.LineTo(p1, true, true);
//绘制时间
strTime = TickLineValue.drawTickData[i].dateTime;
strTime = dealTimeString(strTime, oldTime);
if (strTime == "")
{
continue;
}
oldTime = strTime;
FormattedText t = new FormattedText(strTime, System.Globalization.CultureInfo.InvariantCulture,
FlowDirection.LeftToRight, new Typeface(fontFamily.ToString()), TickLineValue.timeFontSize,
timeB);
if (oldX<p0.X)
{
p0.Y = timeY;
dc.DrawText(t, p0);
oldX = p0.X + t.Width;
}
}
}
dc.DrawGeometry((Brush)null, tickPen, _cueGeometry);
dc.DrawGeometry((Brush)null, perPen, _perGeometry);
dc.DrawGeometry((Brush)null, volPen, _volGeometry);
}
catch (Exception ex)
{
TickLineValue.picErrorLog.log(5, "TickPictureCanvas|DrawPicTick|" + ex.ToString());
}
}
如果是连续的曲线,那么就使用一次BeginFigure(p0, true, false);如果是每次都是独立的线段,那么
就可以多次使用:BeginFigure(p0, true, false);
通过查询资料,我们找到一个方法可以解决:使用StreamGeometry在内存中绘制,然后再Render到WPF的控件上。
实现如下:
using (var geometryContext = _cueGeometry.Open())
using (var perContext = _perGeometry.Open())
using (var _volContext = _volGeometry.Open())
{
for (int i = 0; i < TickLineValue.drawTickData.Count() - 1; i++)
{
TickLineValue.drawTickData[i].picTopY = topY;
TickLineValue.drawTickData[i].PriceMax = TickLineValue.tickMaxValue;
TickLineValue.drawTickData[i].PriceMin = TickLineValue.tickMinValue;
TickLineValue.drawTickData[i].ScreenTickHeight = TickLineValue.tickHeight;
TickLineValue.drawTickData[i].VolMax = TickLineValue.volMaxValue;
TickLineValue.drawTickData[i].picVolTopY = TickLineValue.lineObject.GetYValue() + TickLineValue.perPicTxtHeight;
TickLineValue.drawTickData[i].ScreenVolHeight = TickLineValue.volHeight;
//绘制图形的
x = TickLineValue.picLeftWidth + i * TickLineValue.picWidth;
//绘制tick
Point p0 = new Point();
p0.X = x;
p0.Y = TickLineValue.drawTickData[i].newPriceY;
if (i == 0)
{
geometryContext.BeginFigure(p0, true, false);
}
else
{
geometryContext.LineTo(p0, true, true);
}
//绘制均线
p0.Y = TickLineValue.drawTickData[i].perPriceY;
if (i == 0)
{
perContext.BeginFigure(p0, true, false);
}
else
{
perContext.LineTo(p0, true, true);
}
////绘制交易量
p0.Y = TickLineValue.drawTickData[i].tradeVolY;
Point p1 = new Point();
p1.X = x;
p1.Y = volY;
_volContext.BeginFigure(p0, true, false);
_volContext.LineTo(p1, true, true);
//绘制时间
strTime = TickLineValue.drawTickData[i].dateTime;
strTime = dealTimeString(strTime, oldTime);
if (strTime == "")
{
continue;
}
oldTime = strTime;
FormattedText t = new FormattedText(strTime, System.Globalization.CultureInfo.InvariantCulture,
FlowDirection.LeftToRight, new Typeface(fontFamily.ToString()), TickLineValue.timeFontSize,
timeB);
if (oldX<p0.X)
{
p0.Y = timeY;
dc.DrawText(t, p0);
oldX = p0.X + t.Width;
}
}
}
dc.DrawGeometry((Brush)null, tickPen, _cueGeometry);
dc.DrawGeometry((Brush)null, perPen, _perGeometry);
dc.DrawGeometry((Brush)null, volPen, _volGeometry);
}
catch (Exception ex)
{
TickLineValue.picErrorLog.log(5, "TickPictureCanvas|DrawPicTick|" + ex.ToString());
}
}
如果是连续的曲线,那么就使用一次BeginFigure(p0, true, false);如果是每次都是独立的线段,那么
就可以多次使用:BeginFigure(p0, true, false);
相关文章推荐
- WPF 自定义的图表(适用大量数据绘制)
- C#中wpf引用TeeChart绘制图表
- 【C#】第3章补充(一)如何在WPF中绘制正弦曲线
- WPF 自定义的图表(适用大量数据绘制)下
- WPF绘制大量线条效率不如GDI+(WPF+GDIplus解决方案)
- WPF 后台图片绘制线段并生成本地图片文件
- OpenGL In C# 03 在OpenGL中使用WPF绘制的字体
- C# 画(绘制)直线 C#如何画直线 C#绘制直线 WPF 画(绘制)直线
- C#:WPF绘制问题
- WPF绘制线段(直线)的方法
- C# 绘制统计图(柱状图, 折线图, 扇形图)
- c# 判断两条线段是否相交(判断地图多边形是否相交)
- OpenCv学习笔记(七)---OpenCv中的基本绘图函数,圆,椭圆,线段,矩形,多边形的绘制(1)
- 在WPF中自定义你的绘制(四)
- c# 大量拼接xml时内存溢出解决方法
- C# WPF 控件通用属性简介
- 先发个绘制曲线图的:用ASP.NET with C# 绘制曲线图(Curve图)
- WPF中使用amCharts绘制股票K线图
- C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(三十七)地图自适应区域加载
- C# WPF 快速开发08数据库连接配置config