我也刚遇到这个问题。
我有一个用于控件的滚动条,它只计算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()
.