Thanks for the report. You were right: this should work like Xojo.
The bug was that Objo stored an inherited event handler and a same-named custom event definition in the same handler list. So a custom control’s Opening() handler calling RaiseEvent Opening() recursively called itself until the VM reported a stack overflow.
I've have changed the event model so event handlers and event definitions with the same name are distinct. An event handler such as Opening() now consumes the inherited control event, while a same-named event Opening() definition re-exposes a separate event to users of the custom control. RaiseEvent Opening() now raises that event definition rather than re-entering the handler.
This means custom controls can do internal setup in standard events like Opening(), MouseDown(), etc., then call RaiseEvent to forward/re-expose the event to the placed control instance.
This will be in the next release: https://feedback.objo.dev/bug/483