wpf 绘图性能提升

本文介绍了一种提高WPF应用中Canvas绘图性能的方法,通过管理Visual对象列表,自定义添加、删除Visual以及实现命中测试。示例代码展示了如何创建DrawingVisual对象绘制Polyline,并通过冻结画笔提升绘图速度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


 using System.Collections.Generic;

using System.Windows.Controls;

using System.Windows.Media;

using System.Windows;


namespace PostViewer

{

    public class DrawingCanvas : Canvas

    {

        private List<Visual> visuals = new List<Visual>();

    

        //获取Visual的个数

        protected override int VisualChildrenCount

        {

            get { return visuals.Count; }

        }


        //获取Visual

        protected override Visual GetVisualChild(int index)

        {

            return visuals[index];

        }

    

        //添加Visual

        public void AddVisual(Visual visual)

        {

            visuals.Add(visual);


            base.AddVisualChild(visual);

            base.AddLogicalChild(visual);

        }


        //删除Visual

        public void RemoveVisual(Visual visual)

        {

            visuals.Remove(visual);


            base.RemoveVisualChild(visual);

            base.RemoveLogicalChild(visual);

        }


        //命中测试

        public DrawingVisual GetVisual(Point point)

        {

            HitTestResult hitResult = VisualTreeHelper.HitTest(this, point);

            return hitResult.VisualHit as DrawingVisual;

        }


        //使用DrawVisual画Polyline

        public Visual Polyline(PointCollection points, Brush color, double thinkness)

        {

            DrawingVisual visual = new DrawingVisual();

            DrawingContext dc = visual.RenderOpen();

            Pen pen = new Pen(Brushes.Red, 3);

            pen.Freeze();  //冻结画笔,这样能加快绘图速度


            for (int i = 0; i < points.Count - 1; i++ )

            {

                dc.DrawLine(pen, points[i], points[i+1]);

            }


            dc.Close();

            return visual;

        }

    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值