我正在尝试更改自定义 WPF 元素以使用可视树,以便可以更改背景层而无需丢弃整个保留的渲染。同时,一个图层可能会受到多个属性的影响,所以我想懒惰地重做渲染,以防多个属性在一个屏幕更新周期中被更改。这就是我所做的。
protected override int VisualChildrenCount
{
get
{
return 1;
}
}
private readonly DrawingVisual textLayer = new DrawingVisual();
bool textLayerReady;
protected override Visual GetVisualChild(int index)
{
switch (index)
{
case 0:
if (!textLayerReady)
{
using (var textContext = textLayer.RenderOpen())
RenderTextLayer(textContext);
}
return textLayer;
default:
throw new ArgumentOutOfRangeException("index");
}
}
它似乎运行正确,但在设计器中我得到:
InvalidOperationException:在 OnRender 回调期间无法调用此 API。在 OnRender 期间,只能执行绘制 Visual 内容的绘制操作。
我想在运行时布局过程GetVisualChild
在实际渲染之前调用,并且设计画布的操作方式不同?
这是一个合理的尝试吗?我应该如何触发子绘图视觉效果的渲染以确保它在合法时间发生?