Thanks for reporting this.
I was able to reproduce it: if a canvas was refreshed before the underlying UI control had completed its first layout pass, Paint(g As Graphics) could receive g.Width = 0 and g.Height = 0 even though the canvas had a normal default/designed size.
This was a bug in Objo Studio’s desktop runtime. The canvas paint wrapper was reading Avalonia’s transient pre-layout bounds directly. I’ve fixed it so Paint() uses the arranged size when available, and falls back to the canvas’ explicit logical size before first layout.
Fixed for the next release: https://feedback.objo.dev/bug/482