WPF is pretty complicated especially when writing custom controls therefore my first suggestion would be - leave it. Take an already existing control or composite few already existing controls into UserControl
instead of writing everything from scratch.
Controls in WPF may contain any other control and the control's children are loaded only when needed. That is why you run into your problem.
The solution is when OnVisualChildrenChanged
event fires, you should run through all children and subscribe to their Initialized or Loaded event. Once the child is loaded the event will fire and the handler will be called. Furthermore inside the handler you shouldn't forget to unsubscribe to the event.