/// <summary> /// Called when the control is loaded on a form /// </summary> /// <param name="e">Event arguments</param> /// <seealso cref="OnPreLoad"></seealso> /// <seealso cref="OnLoadComplete"></seealso> /// <seealso cref="OnUnLoad"></seealso> public virtual void OnLoad(EventArgs e) { if (PropagateLoadEvents) { Control.TriggerLoad(e); } }
/// <summary> /// Sets the parent of the specified <paramref name="child"/> to this container /// </summary> /// <remarks> /// This is used by container authors to set the parent of a child before it is added to the underlying platform control. /// /// The <paramref name="assign"/> parameter should call the handler method to add the child to the parent. /// </remarks> /// <returns><c>true</c>, if parent was set, <c>false</c> otherwise.</returns> /// <param name="child">Child to set the parent</param> /// <param name="assign">Method to assign the child to the handler</param> /// <param name="previousChild">Previous child that the new child is replacing.</param> protected void SetParent(Control child, Action assign = null, Control previousChild = null) { bool triggerPrevious = false; if (previousChild != null && !ReferenceEquals(previousChild.VisualParent, null) && (!ReferenceEquals(previousChild, child) || !ReferenceEquals(child.VisualParent, this))) { #if DEBUG if (!ReferenceEquals(previousChild.VisualParent, this)) { throw new ArgumentException(string.Format(CultureInfo.CurrentCulture, "The child control is not a child of this container. Ensure you only remove children that you own.")); } #endif if (previousChild.Loaded) { previousChild.TriggerUnLoad(EventArgs.Empty); } previousChild.VisualParent = null; triggerPrevious = true; } if (child != null && !ReferenceEquals(child.VisualParent, this)) { // Detach so parent can remove from controls collection if necessary. // prevents UnLoad from being called more than once when containers think a control is still a child // no-op if there is no parent (handled in detach) child.Detach(); if (child.LogicalParent == null) { child.LogicalParent = this; } child.VisualParent = this; if (Loaded && !child.Loaded) { using (child.Platform.Context) { child.TriggerPreLoad(EventArgs.Empty); child.TriggerLoad(EventArgs.Empty); child.TriggerDataContextChanged(EventArgs.Empty); if (assign != null) { assign(); } child.TriggerLoadComplete(EventArgs.Empty); } if (triggerPrevious) { previousChild.TriggerDataContextChanged(EventArgs.Empty); } return; } } if (assign != null) { assign(); } if (triggerPrevious) { previousChild.TriggerDataContextChanged(EventArgs.Empty); } }
/// <summary> /// Sets the parent of the specified <paramref name="child"/> to this container /// </summary> /// <remarks> /// This is used by container authors to set the parent of a child before it is added to the underlying platform control. /// /// The <paramref name="assign"/> parameter should call the handler method to add the child to the parent. /// </remarks> /// <returns><c>true</c>, if parent was set, <c>false</c> otherwise.</returns> /// <param name="child">Child to set the parent</param> /// <param name="assign">Method to assign the child to the handler</param> /// <param name="previousChild">Previous child that the new child is replacing.</param> protected void SetParent(Control child, Action assign, Control previousChild = null) { bool triggerPrevious = false; if (previousChild != null && !ReferenceEquals(previousChild.Parent, null) && (!ReferenceEquals(previousChild, child) || !ReferenceEquals(child.Parent, this))) { #if DEBUG if (!ReferenceEquals(previousChild.Parent, this)) throw new ArgumentException(string.Format(CultureInfo.CurrentCulture, "The child control is not a child of this container. Ensure you only remove children that you own.")); #endif if (previousChild.Loaded) { previousChild.TriggerUnLoad(EventArgs.Empty); } previousChild.Parent = null; triggerPrevious = true; } if (child != null && !ReferenceEquals(child.Parent, this)) { // Detach so parent can remove from controls collection if necessary. // prevents UnLoad from being called more than once when containers think a control is still a child // no-op if there is no parent (handled in detach) child.Detach(); child.Parent = this; if (Loaded && !child.Loaded) { using (child.Platform.Context) { child.TriggerPreLoad(EventArgs.Empty); child.TriggerLoad(EventArgs.Empty); child.TriggerDataContextChanged(EventArgs.Empty); assign(); child.TriggerLoadComplete(EventArgs.Empty); } if (triggerPrevious) previousChild.TriggerDataContextChanged(EventArgs.Empty); return; } } assign(); if (triggerPrevious) previousChild.TriggerDataContextChanged(EventArgs.Empty); }