我有一个自定义绘制控件(覆盖FrameworkElement
)和几个DrawingVisual
个对象。我保留了一系列视觉效果并覆盖了GetVisualChild
和VisualChildrenCount
。性能很重要,因此大多数都使用BitmapCache
。
其中一个视觉效果将每隔50毫秒更新一次新数据。它描绘了机器在现实世界中所采用的路径,因此每50毫秒。有一条新线要画,保留旧线。
以良好的性能绘制这个的最佳方法是什么,所以不重新绘制现有的机器路径,只是添加另一条线?一旦您使用RenderOpen
在视觉中绘制某些内容,您就无法对其进行修改。我试过了visual.Drawing.Append()
,但它似乎并没有画任何东西。
有没有办法向DrawingVisual
添加新数据?如果不是,那么使用什么呢?
答案 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);
}
}
}