WPF 绘图方式

记录一下

WPF的三种绘图方式:
1、System.Windows.Shapes命名空间中的基本组件比如Polyline
特点:方便、更改后台数据即可,大量数据下CPU高,建议用来做一次性绘制

//初始化一个画线的对象,轻量级的
Polyline curvePolyline = new Polyline();
//初始化点的集合
PointCollection coordinatePoints = new PointCollection();
//设置画线对象用什么颜色画
curvePolyline.Stroke = Brushes.Red;
//告诉对象线的宽度
curvePolyline.StrokeThickness = 2;
//设置绘制的起点
Canvas.SetLeft(curvePolyline, 5);
Canvas.SetTop(curvePolyline, 5);
//添加1000个点
for (int i = 0; i < 1000; i++)
{
     
     coordinatePoints.Add(new Point(i, 100));
}
//给对象赋值
curvePolyline.Points = coordinatePoints;
//界面添加该对象
canvas.Children.Add(curvePolyline);

2、DrawVisual 这是用来绘制窗体背景效果的,不带事件功能
特点:由这个创建一个DataContext对象,由这个对象去绘制,就和GDI一样了

//创建一个绘图的可视对象
DrawingVisual visualx = new DrawingVisual(); 
//准备一支笔
Pen pen = new Pen(Brushes.Red, 2);
//创建绘图对象,类似GDI中的Graphics 
using (DrawingContext context = visualx.RenderOpen())
{
     
    //绘制1000条线
    for (int i = 0; i < 1000; i++)
    {
     
          context.DrawLine(pen, new Point(i, 100), new Point(i + 1, 100));
    }
    //关闭绘图对象,并刷新内容
	context.Close();
	//初始化一个转换对象
	RenderTargetBitmap composeImage = new RenderTargetBitmap((int)img.Width, (int)img.Height, 0, 0, PixelFormats.Pbgra32);
	//呈现可视化对象,把对象赋值给composeImage	
    composeImage.Render(visualx);
    //给界面赋值
    img.Source = composeImage;
}

3、WriteableBitmap+GDI模式
特点:快,cpu低,GDI模式

int w = (int)img.Width;
int h = (int)img.Height;
//创建一个24位图像的WriteableBitmap位图
WriteableBitmap bt = new WriteableBitmap(w, h, 96, 96, PixelFormats.Rgb24, null);
//锁住它,因为接下来要操作
bt.Lock();
//创建一张图
using (Bitmap bbb = new Bitmap(w, h,bt.BackBufferStride,System.Drawing.Imaging.PixelFormat.Format24bppRgb,bt.BackBuffer))
{
     
     using (Graphics g = Graphics.FromImage(bbb))
     {
     
         //画个1000个点
         PointF[] abc = new PointF[1000];
         for (int i = 0; i < 1000; i++)
         {
     
               abc[i].X = i;
               abc[i].Y = i;
          }
          //背景设置成白色
          g.Clear(System.Drawing.Color.White);
          //一次性绘制所有的点
          g.DrawLines(Pens.Red, abc);
          //
          g.Flush();
      }
      //对这个区域做一些处理
      bt.AddDirtyRect(new Int32Rect(0, 0, w, h));
      //解锁
      bt.Unlock();
}
//给Image控件赋值
img.Source = bt;

你可能感兴趣的:(WPF,wpf)