我想动态地画一些东西。以下代码显示了我的 OnRender。我正在程序中需要的地方设置 DrawItem 。但当我打电话时DrawItem =5;
我必须调用什么才能调用 OnRender?
protected override void OnRender(DrawingContext drawingContext)
{
switch (DrawItem)
{
case 1:
//Draw Item
break;
case 2:
//Draw Item
break;
case 3:
//Draw Item
break;
case 4:
//Draw Item
break;
case 5:
//Draw Item
break;
}
base.OnRender(drawingContext)
}
public int DrawItem { get; set; }
如果控件的大小发生变化,您可以使用InvalidateVisual()
,但请记住,这会导致 UI 重新布局的成本相当昂贵。如果控件的大小保持不变,则不应调用InvalidateVisual()
.
更新 UI 的更有效方法是创建一个DrawingGroup
“后备存储”并将其添加到DrawingContext
during OnRender()
。然后您可以随时更新它,使用DrawingGroup.Open()
,WPF 将更新您的 UI。
如果这听起来令人困惑,请记住 WPF 是retained绘图系统。这意味着OnRender()
可能更好地称为AccumulateDrawingObjects()
。它实际上积累了一棵实时绘图对象树,其中一些对象(如 DrawingGroup、RenderTargetBitmap 和 WriteableBitmap)可以稍后更新。
它看起来是这样的:
DrawingGroup backingStore = new DrawingGroup();
protected override void OnRender(DrawingContext drawingContext) {
base.OnRender(drawingContext);
Render(); // put content into our backingStore
drawingContext.DrawDrawing(backingStore);
}
// I can call this anytime, and it'll update my visual drawing
// without ever triggering layout or OnRender()
private void Render() {
var drawingContext = backingStore.Open();
Render(drawingContext);
drawingContext.Close();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)