Detach() public method

Detaches the control by removing it from its parent
This is essentially a shortcut to myControl.Parent.Remove(myControl);
public Detach ( ) : void
return void
Ejemplo n.º 1
0
        /// <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);
            }
        }
Ejemplo n.º 2
0
 /// <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;
 }
Ejemplo n.º 3
0
        /// <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);
        }
Ejemplo n.º 4
0
		/// <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;
		}
Ejemplo n.º 5
0
		/// <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);
		}