在WPF中绘制图表比较简单,有很多的第三方控件,但是在绘制大量数据的时候,就显得有些吃力,即便是自己用StreamGeometry画也达不到理想的效果,要达到绘制大量数据而不会顿卡现象,只有一个途径,就是首先在内存中绘制好所有的图形,再一次性加载(或者说绘制)到界面控件Canvas或Grid中。
废话不多说,直接看效果吧
选中放大效果
源代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Threading;
namespace Zero_Gjy.UserControls
{
public class DrawingCanvas : Canvas
{
private List<Visual> visuals = new List<Visual>();
public enum MouseMode
{
ZOOM,
VIEW
}
public MouseMode mMode = MouseMode.VIEW;
public DrawingCanvas()
{
this.Background = Brushes.Transparent;
this.PreviewMouseLeftButtonDown += DrawingCanvas_MouseLeftButtonDown;
this.PreviewMouseLeftButtonUp += DrawingCanvas_MouseLeftButtonUp;
this.MouseMove += DrawingCanvas_MouseMove;
this.MouseLeave += DrawingCanvas_MouseLeave;
}
private void DrawingCanvas_MouseLeave(object sender, System.Windows.Input.MouseEventArgs e)
{
if(mMode == MouseMode.VIEW && textVisual !=null)
{
this.RemoveVisual(textVisual);
this.InvalidateVisual();
}
}
private void DrawingCanvas_MouseLeftButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
isMouseDown = false;
mMode = MouseMode.VIEW;
endup = e.GetPosition(this).X;
if (endup < YZero)
endup = YZero;
if (endup > canvasWidth)
endup = canvasWidth;
//重画 选中区域
double step = (canvasWidth - YZero) / sData.Count;
if (isMouseMoved && Math.Abs(endup - startDown) > step)
{
int startIndex = 0;
int endIndex = 0;
if (endup > startDown)
{
startIndex = (int)((startDown - YZero) / step)+1;
endIndex = (int)((endup - YZero) / step);
}
else
{
startIndex = (int)((endup - YZero) / step)+1;
endIndex = (int)((startDown - YZero) / step);
}
//暂存
DoubleCollection tempM = new DoubleCollection(mData.Count);
DoubleCollection tempS = new DoubleCollection(sData.Count);
for(int i = 0;i < mData.Count;i++)
{
tempM.Add(mData[i]);
tempS.Add(sData[i]);
}
mData.Clear();
sData.Clear();
for(int i = startInde