有没有办法将数据添加到DrawingVisual

时间:2016-02-05 22:04:10

标签: c# wpf drawing

我有一个自定义绘制控件(覆盖FrameworkElement)和几个DrawingVisual个对象。我保留了一系列视觉效果并覆盖了GetVisualChildVisualChildrenCount。性能很重要,因此大多数都使用BitmapCache

其中一个视觉效果将每隔50毫秒更新一次新数据。它描绘了机器在现实世界中所采用的路径,因此每50毫秒。有一条新线要画,保留旧线。

以良好的性能绘制这个的最佳方法是什么,所以不重新绘制现有的机器路径,只是添加另一条线?一旦您使用RenderOpen在视觉中绘制某些内容,您就无法对其进行修改。我试过了visual.Drawing.Append(),但它似乎并没有画任何东西。

有没有办法向DrawingVisual添加新数据?如果不是,那么使用什么呢?

1 个答案:

答案 0 :(得分:1)

也许创建一个你绘制的RenderTargetBitmap,然后在进行OnRender调用时做一个Context.DrawImage

using System;
using System.ComponentModel;
using System.Windows;
using System.Windows.Media;
using System.Windows.Media.Imaging;

namespace WpfApplication13
{
    public class PanelTest : FrameworkElement
    {
        public RenderTargetBitmap _renderTargetBitmap = null;
        public System.Windows.Threading.DispatcherTimer _Timer = null;
        public int _iYLoc = 0;
        private Pen _pen = null;

        protected override void OnRender(DrawingContext drawingContext)
        {
            if (!DesignerProperties.GetIsInDesignMode(this))
            {
                drawingContext.DrawImage(_renderTargetBitmap, new Rect(0, 0, 250, 250));
            }


            base.OnRender(drawingContext);
        }

        public PanelTest() :base()
        {
            _renderTargetBitmap = new RenderTargetBitmap(250, 250, 96, 96, System.Windows.Media.PixelFormats.Pbgra32);
            _pen = new Pen(Brushes.Red, 1);
            _Timer = new System.Windows.Threading.DispatcherTimer();
            _Timer.Interval = new TimeSpan(0, 0, 0, 0, 50);
            _Timer.Tick += _Timer_Tick;
            if (!DesignerProperties.GetIsInDesignMode(this))
            {
                _Timer.Start();
            }
        }

        private void _Timer_Tick(object sender, EventArgs e)
        {

            DrawingVisual vis = new DrawingVisual();
            DrawingContext con = vis.RenderOpen();
            con.DrawLine(_pen, new Point(0, _iYLoc), new Point(250, _iYLoc));
            _iYLoc++;

            con.Close();

            _renderTargetBitmap.Render(vis);
        }
    }

}