小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

WPF: 使用DrawVisual提高大數(shù)據(jù)量時的繪圖性能

 牛人的尾巴 2016-06-15

WPF: 使用DrawVisual提高大數(shù)據(jù)量時的繪圖性能

在WPF中繪制形狀時,如果數(shù)據(jù)量大(例如一條Polyline有10萬多個數(shù)據(jù)點),繪制過程會很慢。目前能想到的解決辦法有:

1. 將形狀繪制在位圖里。
2. 升級到最新.net4.5,WPF性能提升不少(這個要贊)
3. 使用DrawVisual來實現(xiàn)畫圖。

 

下面主要談一下DrawVisual的用法。Visual 類的層次結(jié)構(gòu)如下:

從 Visual 對象派生的類的示意圖

DrawingVisual 繼承自Visual,是一個用于呈現(xiàn)形狀、圖像或文本的輕量繪圖類。 此類之所以被視為輕量,是因為它不提供布局或事件處理功能,從而能夠改善運(yùn)行時性能。 因此,繪圖最適于背景和剪貼畫。 DrawingVisual 可用于創(chuàng)建自定義可視化對象。

在下面代碼中,創(chuàng)建了一個繼承自Canvas的類DrawingCanvas。該類實現(xiàn)了Visual的一些基本操作,并添加了用DrawVisual繪制Polyline方法。

復(fù)制代碼
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的個數(shù)
        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();  //凍結(jié)畫筆,這樣能加快繪圖速度

            for (int i = 0; i < points.Count - 1; i++ )
            {
                dc.DrawLine(pen, points[i], points[i+1]);
            }

            dc.Close();
            return visual;
        }
    }
}    
復(fù)制代碼

 

繪制其他形狀的方法,請參見MSDN中的DrawingContext類。

 

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多