我也刚遇到这个问题。
我有一个用于控件的滚动条,它只计算OnRender()显示所有内容真正需要多少空间,这可能大于可用的显示空间,因此需要一个滚动条。可能会OnRender()调用一些方法,这些方法最终会改变滚动条的值,而滚动条应该OnRender()以InvalidateVisual().
但是,OnRender()之后没有再被叫到InvalidateVisual()。我猜原因是InvalidateVisual()设置了一些标志,告诉 WPF 控件需要再次绘制,但是一旦OnRender()完成,该标志就会被重置。这里有一些伪代码,我希望它如何发生:
//someCode:
control.InvalidateVisual()
//code of InvalidateVisual()
control.RedrawFlag = true;
//WPF some time later:
if (control.RedrawFlag){
control.OnRender()
//OnRender code
//do some stuff
//decide control needs to be redrawn
//however, RedrawFlag is alreday true!
//next line is not changing anything
control.RedrawFlag = true;
//WPF finished executing control.OnRender
control.RedrawFlag = false;
}
我没有进一步调查 WPF 是否真的以这种方式工作,但它可以解释为什么OnRender()不被第二次调用。
我没有浪费更多时间,而是更改了如何计算控件内容的总宽度,并将此代码放在OnRender().