首先需要实例化一个DrawingVisual 对象,然后通过该对象的RenderOpen()方法获取绘图上下文DrawingContext 对象,通过该对象即可实现绘制功能,使用完后调用Close()方法关闭绘图上下文,即表示完成绘画。如果要让绘制图像在WPF元素上显示,还需要调用WPF元素对象的AddVisual(xx) 方法把可视化对象加入到元素中。
DrawingVisual visual=new DrawingVisual();
DrawingContext dc=DrawingVisual.RenderOpen();
dc.Close()
dc.DrawLine(); //画直线
dc.DrawRectangle();
dc.DrawRoundRectangle();
dc.DrawEllipse();
dc.DrawGeometry(); //画几何图形
dc.DrawText();
dc.DrawImage();
dc.DrawVideo(); //绘制视频
myPanel=new MyPanel();
DrawingVisual visual=new DrawingVisual();
using(DrawingContext dc=visual.RenderOpen())
{
Pen drawingPen=new Pen(Brushes.Black,3);
dc.DrawLine(drawingPen, new Point(0, 50), new Point(50, 0));
dc.DrawLine(drawingPen, new Point(50, 0), new Point(100, 50));
dc.DrawLine(drawingPen, new Point(0, 50), new Point(100, 50));
dc.Close();
myPanel.AddVisual(dv);
}
示例:
using System.Windows;
using System.Windows.Media;
namespace WpfApp_DrawingVisual
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
Loaded += MainWindow_Loaded;
}
/// <summary>
/// UIElement 中的所有元素都是继承自Visual 可视化类,DrawingVisual 也是其子类
/// 继承关系:DrawingVisual->ContainerVisual->Visual
/// 因此DrawingVisual 可以加入到所有的WPF 元素中,加入方法 XXX.AddVisual(),相当于在该元素上绘制图形
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
DrawingVisual dv = new DrawingVisual(); //实例化可视化对象
DrawingContext dc = dv.RenderOpen(); //获取绘图上下文对象
Brush brush = Brushes.LightGreen; //获取画刷对象
Pen drawingPen = new Pen(Brushes.SteelBlue, 3); //实例化画笔对象
//绘制图形
dc.DrawRectangle(brush, drawingPen, new Rect(new Point(1000,100),new Size(50,100)));
dc.DrawEllipse(brush, drawingPen, new Point(400, 500), 200, 120);
dc.DrawLine(drawingPen, new Point(0, 50), new Point(50, 0));
dc.DrawLine(drawingPen, new Point(50, 0), new Point(100, 50));
dc.DrawLine(drawingPen, new Point(0, 50), new Point(100, 50));
dc.Close(); //关闭绘图上下文对象
myPanel.AddVisual(dv); //把可视化对象加入到容器myPanel中
}
}
}
自定义MyPanel 类 代码:
using System.Collections.Generic;
using System.Windows.Controls;
using System.Windows.Media;
namespace WpfApp_DrawingVisual
{
public class MyPanel:Panel
{
private List<Visual> visuals = new List<Visual>(); //定义可视化集合对象
protected override Visual GetVisualChild(int index) //重写可视化对象获取方法
{
return visuals[index];
}
protected override int VisualChildrenCount => visuals.Count; //重写可视化属性,可视化元素数量
public void AddVisual(Visual visual) { //添加可视化元素方法
visuals.Add(visual);
base.AddLogicalChild(visual);
base.AddVisualChild(visual);
}
}
}
效果
