/// <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> /// Removes the child control from the logical parent of this container. /// </summary> /// <remarks> /// This should be used from containers that use other Eto controls to layout its children but should not be part /// of the logical heirarchy. /// </remarks> /// <seealso cref="SetLogicalParent"/> /// <param name="child">Child to remove from this container as the logical parent.</param> protected void RemoveLogicalParent(Control child) { if (child == null) { return; } if (!ReferenceEquals(child.LogicalParent, this)) { throw new ArgumentException(string.Format(CultureInfo.CurrentCulture, "The child control is not a logical child of this container. Ensure you only remove children that you own.")); } child.Detach(); child.LogicalParent = null; }
/// <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. /// /// If this returns <c>true</c>, you should call <see cref="Control.OnLoadComplete"/> after the control has been added /// to the underlying platform control. /// </remarks> /// <returns><c>true</c>, if parent was set, <c>false</c> otherwise.</returns> /// <param name="child">Child to set the parent</param> protected bool SetParent(Control child) { 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) { child.OnPreLoad(EventArgs.Empty); child.OnLoad(EventArgs.Empty); child.OnDataContextChanged(EventArgs.Empty); return(true); } } return(false); }
/// <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. /// /// If this returns <c>true</c>, you should call <see cref="Control.OnLoadComplete"/> after the control has been added /// to the underlying platform control. /// </remarks> /// <returns><c>true</c>, if parent was set, <c>false</c> otherwise.</returns> /// <param name="child">Child to set the parent</param> protected bool SetParent(Control child) { 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) { child.OnPreLoad(EventArgs.Empty); child.OnLoad(EventArgs.Empty); child.OnDataContextChanged(EventArgs.Empty); return true; } } return false; }
/// <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); }